Excel中的浮点数

时间:2015-02-04 14:44:52

标签: java floating-point

我的excel表中有一个double值的问题。 double值是宏计算的结果。 它以1.0554显示在单元格中。 单元格格式为显示4个小数点的数字。如果我选择更多小数,它将显示为尾随0(E.G。1.05540000)。

我的问题是我用jxls(使用Apache POI)读取此文件,我得到的值不是1.0554而是1.0554000000000001(最后1个)是第16位数。)

我已将xls转换为xlsx,直接在xlsx内部检查(这是一个包含xml文件的zip文件,因此ascii文件),保存的值为1.0554000000000001;但即使我将单元格格式化为32位十进制数字,excel仍会显示1.0554000...000而不会有任何尾随1。

所以我认为在xls中,实数也保存为1.0554000000000001而不是1.0554。

那么如何在excel中显示真正的原始价值呢?或强制excel保存1.0554而不是1.05540000 ... 01?或者用宏检查显示值是不是原始值?...

2 个答案:

答案 0 :(得分:1)

你与IEE754众神发生了冲突。双值有1个符号位,11位指数和52位尾数(实际表示有点复杂,但你应该从中得到的是数字1.0554在52位内无法正确表达,所以双PC的实现选择最接近的值。

答案 1 :(得分:1)

一旦转换无法准确表示的数字,浮点舍入错误就会起作用。它会随着你的计算而增加。

1.0554的最接近的可表示值是1.0553999999999998937738610038650222122669219970703125。与1.0554000000000001最接近的可表示值是1.055400000000000115818465928896330296993255615234375 - 这可能是您的宏计算得出的结果。坏消息是你没有得到你想要的价值。好消息是,在这种情况下,差异往往是太小而不重要,甚至无法衡量,在现实生活中。

通常,您不希望打印确切的值。 Java中的默认toString行为是产生可转换为内部值的最短十进制扩展。这通常也不是最终用户显示的目的。

在大多数情况下,正确的做法正是您在Excel中所做的事情 - 只显示您认为正在做的事情的数字。在Java中,您可以使用DecimalFormatdouble转换为String,同时控制显示的数字。