我的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?或者用宏检查显示值是不是原始值?...
答案 0 :(得分:1)
你与IEE754众神发生了冲突。双值有1个符号位,11位指数和52位尾数(实际表示有点复杂,但你应该从中得到的是数字1.0554在52位内无法正确表达,所以双PC的实现选择最接近的值。
答案 1 :(得分:1)
一旦转换无法准确表示的数字,浮点舍入错误就会起作用。它会随着你的计算而增加。
1.0554的最接近的可表示值是1.0553999999999998937738610038650222122669219970703125。与1.0554000000000001最接近的可表示值是1.055400000000000115818465928896330296993255615234375 - 这可能是您的宏计算得出的结果。坏消息是你没有得到你想要的价值。好消息是,在这种情况下,差异往往是太小而不重要,甚至无法衡量,在现实生活中。
通常,您不希望打印确切的值。 Java中的默认toString
行为是产生可转换为内部值的最短十进制扩展。这通常也不是最终用户显示的目的。
在大多数情况下,正确的做法正是您在Excel中所做的事情 - 只显示您认为正在做的事情的数字。在Java中,您可以使用DecimalFormat
将double
转换为String
,同时控制显示的数字。