栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

匹配Java中的Excel浮点

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

匹配Java中的Excel浮点

我同意mcnamara的先前回答。这个答案就此展开。

不幸的是,这与用户在Excel中看到的数字不同。谁能指出我要使用一种算法来获得用户在Excel中看到的相同数字?

我认为这里没有使用算法。Excel在内部使用IEEE754 double,并且我猜它printf在显示数字时仅使用一种样式格式:

$ python -c 'print "%.14g" % -130.98999999999069' -130.98999999999$ python -c 'print "%.14g" % -130.9899999999907' -130.98999999999

对于每个IEEE 754
64位二进制浮点数,在输入时会有一个十进制小数范围会四舍五入。从-130.98999999999069开始,最接近的可表示值为-130.98999999999068677425384521484375。在使用半舍入四舍五入规则进行四舍五入到最接近的情况下,[-130.9899999999907009851085604168474674274224853515625,-130.9899999999906725633991300128400325775146484375]范围内的任何内容都会四舍五入到该值。(该范围是封闭的,因为中心数字的二进制表示形式是偶数。如果它是奇数,则该范围将是开放的)。-130.98999999999069和-130.9899999999907都在范围内。

您确实具有与Excel相同的浮点数。 您确实具有与输入到Excel相同的浮点数。不幸的是,进一步的实验表明Excel
2007只能转换输入的最高15位数字。我将-130.98999999999069粘贴到Excel单元格中。它不仅显示为-130.98999999999,使用它的算术运算还与最接近该值的双精度数-130.989999999990004653227515518665313720703125一致,而不是原始输入。

为了获得与Excel相同的效果,您可能需要使用例如BigDecimal将其截断为15个十进制数字,然后转换为double。

Java对浮点值的默认字符串转换基本上选择了十进制小数,该十进制小数位数最少,可以转换回原始值。-130.9899999999907的小数位数少于-130.98999999999069。显然,Excel显示的数字较少,但是Apache
POI正在获得与Java中相同数字的表示形式之一。

这是我用来获取此答案中数字的程序。请注意,我仅使用BigDecimal来获取精确的双打输出,并计算两个连续双打之间的中点。

import java.math.BigDecimal;class Test {  public static void main(String[] args) {    double d = -130.98999999999069;    BigDecimal dDec = new BigDecimal(d);    System.out.println("Printed as double: "+d);    BigDecimal down = new BigDecimal(Math.nextAfter(d, Double.NEGATIVE_INFINITY));    System.out.println("Next down: " + down);    System.out.println("Half down: " + down.add(dDec).divide(BigDecimal.valueOf(2)));    System.out.println("Original: " + dDec);    BigDecimal up = new BigDecimal(Math.nextAfter(d, Double.POSITIVE_INFINITY));    System.out.println("Half up: " + up.add(dDec).divide(BigDecimal.valueOf(2)));    System.out.println("Next up: " + up);    System.out.println("Original in hex: "+Long.toHexString(Double.doubleToLongBits(d)));  }}

这是它的输出:

Printed as double: -130.9899999999907Next down: -130.989999999990715195963275618851184844970703125Half down: -130.9899999999907009851085604168474674224853515625Original: -130.98999999999068677425384521484375Half up: -130.9899999999906725633991300128400325775146484375Next up: -130.989999999990658352544414810836315155029296875Original in hex: c0605fae147ae000


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号