埃菲尔铁塔:REAL_32.to_double给出了一个奇怪的值

时间:2019-01-25 23:24:19

标签: eiffel

尝试将real_32转换为real_64,我得到

real_32: 61.55
real_64: 61.54999923706055 

我对to_double函数有误吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

这是expected。在特定示例中,十进制数61.55的具有单精度和双精度的二进制表示分别为:

REAL_32: 0    10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100110011001100110011001100110

如您所见,尾随模式0011是重复出现的,应该无限次地输入 来给出精确的值。

REAL_32分配给REAL_64时,结尾的0011不会自动添加,而是用零填充:

REAL_32: 0    10000100 11101100011001100110011
REAL_64: 0 10000000100 1110110001100110011001100000000000000000000000000000

以十进制表示法,它对应于61.54999923706055。这里最重要的是,61.5499992370605561.55在使用单精度浮点数时具有完全相同的二进制表示形式。您可以自己使用print ({REAL_32} 61.55 = {REAL_32} 61.54999923706055)进行检查。换句话说,您得到的结果是正确,并且两个值相同。唯一的不同是,在打印REAL_32时,它会四舍五入为较小的有效十进制数字。

这就是为什么会计和簿记软件从不使用浮点数,而只能使用整数和十进制的原因。

答案 1 :(得分:0)

作为一种从JSON到打字稿反序列化的解决方法,以下工作有效:

 a_real_32.out.to_real_64