2015-10-08 4 views
0

Я хочу использовать как двойное значение до 2 знаков после запятой. Но я думаю, что получил Неверное значение.Почему результаты десятичной операции неверны?

1,965 = должен быть 1,97, но результат 1,96

Я загнал их:

DecimalFormat("0.00") или DecimalFormat("#.##") или NumberFormat.getInstance()/..setMaximumFractionDigits(2)

но результат не изменился.

Спасибо ..

Log.e("Result:", String.format("%.2f", 1.965)); // 1.96 < ? 
    Log.e("Result:", String.format("%.2f", 1.975)); // 1.98 
    Log.e("Result:", String.format("%.2f", 1.955)); // 1.96 
    Log.e("Result:", String.format("%.2f", 1.9650)); // 1.96 < ? 
    Log.e("Result:", String.format("%.2f", 1.9651)); // 1.97 
    Log.e("Result:", String.format("%.2f", 1.966)); // 1.97 
+1

Возможно, вы захотите добавить языковой тег. –

+1

Я не получаю те же результаты: https://ideone.com/vzrOmn Пожалуйста, дайте нам более подробную информацию, например, версию jdk, локаль и т. Д.? –

ответ

1

Причина, в том, как числа с плавающей точкой repesented внутри. Они имеют вид (двоичная мантисса) * 2^(двоичный показатель). Как правило, любое десятичное число не может быть представлено точно в двоичной форме, поэтому некоторое округление происходит уже при расчете этого представления.

Вкратце, ваш номер 1,965, скорее всего, будет представлен как двоичное число с плавающей запятой, которое немного меньше 1,965, а когда ваша программа округляет его до 2 десятичных знаков, вы получаете такой неожиданный результат ,

Здесь http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html представляет собой исчерпывающий обзор ловушек арифметики с плавающей запятой.

+0

Нечетная вещь заключается в том, что, предполагая, что бинарный бит IEEE 754 удваивается и округлый до ближайшего режима округления, '1.965' должен фактически храниться как' 1.9650000000000000799360577730112709105014801025390625', поэтому должен округлить. Это звучит как неаккуратная реализация формата. –

+1

А, мы на андроиде. Это может объяснить, почему есть ярлыки, приводящие к преобразованию строк в двойное преобразование (при конвертировании двойного или двойного) или не-правильно округленное преобразование с двойной строкой (в операции форматирования). –