Eiffel:REAL_32.to_double 给出了一个奇怪的值

Eiffel: REAL_32.to_double gives a strange value

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

real_32: 61.55
real_64: 61.54999923706055 

我对 to_double 函数有误吗?

这是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 时,它被四舍五入到有意义的小数位数。

这就是会计记账软件从不使用浮点数,只使用整数和小数的原因。

作为从 JSON 进入 typescript 反序列化的 解决方法,以下方法有效:

 a_real_32.out.to_real_64