为什么不到!int()正常工作?

时间:2014-12-26 07:24:30

标签: d floating-accuracy floating-point-precision

为什么这个断言失败了?

import std.conv;

void main()
{
    auto y = 0.6, delta=0.1;
    auto r = to!int(y/delta);
    assert(r == 6);
}

r的值应该是6而它的5,为什么?

2 个答案:

答案 0 :(得分:5)

这可能是因为0.6不能纯粹用浮点数表示。你写的是0.6,但这并不是你得到的 - 你得到的东西是0.599999999。当你除以0.1时,得到类似于5.99999999的东西,它转换为5的整数(通过向下舍入)。

其他语言的例子:

C#:Why is (double)0.6f > (double)(6/10f)?

Java:Can someone please explain me that in java why 0.6 is <0.6f but 0.7is >=0.7f

答案 1 :(得分:4)

计算机表示二进制的浮点数。十进制数0.6和0.1没有精确的二进制表示,而用于表示它们的位数是有限的。结果,会有截断,其效果在分裂期间可见。该除法的结果不完全是6.00000000,但可能是5.99999999,然后被截断为5.