我对IEEE 754有相当了解,因此这不是那种“为什么将数字a和数字b相加会导致...”类型的问题。
相反,我想问一下我是否正确理解了定点数格式说明符,因为它对某些双精度值的行为不符合我的预期。
例如:
double d = 0x3FffffFFFFfffe * (1.0 / 0x3FffffFFFFffff);
Console.WriteLine(d.ToString("R"));
Console.WriteLine(d.ToString("G20"));
Console.WriteLine(d.ToString("F20"));
无论是 "R"
还是 "G"
格式说明符都会输出正确的值:0.99999999999999989
,但是 "F"
格式说明符总是四舍五入到 1.0
,无论我告诉它包括多少个小数位。即使我告诉它打印最大数量的99个小数位("F99"
),它仍然只输出“1.”后面跟着99个零。
所以我的理解是否有误?能否有人指出规范中相关的部分,或者这种行为是否有问题?(这对我来说不是致命的问题,我只是想知道。)
这里 是我查看的内容,但我没有看到任何解释。
(这是 .Net4.0 版本)
float x = /*some calculation*/; bool isIdentical = x == (float)x;
可能不会像人们期望的那样始终返回true...(如果我记得规范正确的话)。 - AnorZaken