Eiffel: REAL_32.to_double дает странное значение - PullRequest
0 голосов
/ 26 января 2019

Пытаясь преобразовать real_32 в real_64, я получаю

real_32: 61.55
real_64: 61.54999923706055 

Я ошибаюсь с функцией to_double?

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 января 2019

В качестве временного решения , работающего для перехода из JSON в десериализацию машинописного текста, сработало следующее:

 a_real_32.out.to_real_64
0 голосов
/ 26 января 2019

Это ожидается .В конкретном примере двоичное представление десятичного числа 61,55 с одинарной и двойной точностью соответственно:

REAL_32: 0    10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100110011001100110011001100110

Как видите, трейлинг-паттерн 0011 является рекуррентным и должен идти до бесконечности, чтобы дать точное значение.

Когда REAL_32 назначено REAL_64, конечные 0011 s не добавляются автоматически, а вместо этого заполняются нулями:

REAL_32: 0    10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100000000000000000000000000000

В десятичной записи это соответствует 61.54999923706055.Что здесь важно, 61.54999923706055 и 61.55 имеют абсолютно одинаковое двоичное представление при использовании плавающих чисел одинарной точности.Вы можете проверить это самостоятельно с помощью print ({REAL_32} 61.55 = {REAL_32} 61.54999923706055).Другими словами, вы получите правильные и два значения одинаковы.Единственное отличие состоит в том, что при печати REAL_32 оно округляется до меньшего числа значащих десятичных цифр.

По этой причине программное обеспечение бухгалтерского учета и бухгалтерского учета никогда не использует числа с плавающей запятой, только целые и десятичные.

...