Работа с C# Math.Abs возвращает значение - не получает ожидаемый результат
Я хочу найти дельта-значение числа.
Я пытался с этим. я использовал Abs
функция. Это работает нормально для целых чисел.
Но когда я пытаюсь сделать следующее,
var gh = Math.Abs(3.223 - 6.243);
это возвращается 3.0200000000000005
, Но я ожидаю 3.02
,
Зачем? как получить 3.02
?
6 ответов
Потому что вы используете значения типа float/double, которые по своей природе не являются точными на 100% (это связано с их двоичным представлением). Например, вы не можете даже иметь точный 0.1
с числами с плавающей точкой, потому что его двоичное представление является периодическим 1.(1001)
, Это очень полная статья по этому вопросу: что каждый ученый должен знать об арифметике с плавающей точкой
TL; Dr решение заключается в использовании decimal
для точных десятичных арифметических операций
var gh = Math.Abs(3.223m - 6.243m);
Ни 3.223
ни 6.243
точно представимы в двоичной с плавающей точкой. Ваш желаемый ответ 3.02
тоже не совсем представимо.
Если вы хотите точную десятичную арифметику, вы должны использовать decimal
тип. Например:
var gh = Math.Abs(3.223m - 6.243m);
что приведет к gh
быть типом decimal
и с точным значением, которое вы желаете. m
суффикс на литералах используется для обозначения значений типа decimal
,
Полезные ресурсы
Вам нужно отобразить число, подобное этому, или вы хотите использовать его для дальнейших расчетов?
Для его отображения вы можете использовать форматирование строки. Если вы используете его для дальнейших вычислений, вы должны оставить это так и применить усечение там, где вам нужно отобразить числа.
Можете ли вы попробовать это: var sgh= gh.ToString("0.00", CultureInfo.CurrentCulture);
Это зависит от того, сколько цифр вы хотите иметь, если вы хотите иметь десятичную дробь, то var gh = Convert.ToDecimal(Math.Abs (3.223 - 6.243));
Я получаю правильное значение. Попробуйте преобразовать его в Decimal
и, возможно, вы получите правильную точность:
decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));
Удачи!