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

Java

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

Java

这是一个实用程序,可以将双精度舍入(而不是截断)双精度至小数位数。

例如:

round(200.3456, 2); // returns 200.35

原始版本;提防这个

public static double round(double value, int places) {    if (places < 0) throw new IllegalArgumentException();    long factor = (long) Math.pow(10, places);    value = value * factor;    long tmp = Math.round(value);    return (double) tmp / factor;}

这在小数位数很高(例如)或整数部分很大(例如)的极端情况下会严重崩溃。感谢Sloin指出这一点。

round(1000.0d, 17)round(90080070060.1d, 9)

多年来,我一直在使用上面的方法将“不太大”的双精度取整到2或3个小数位(例如,以秒为单位的清理时间用于记录目的:27.987654321987-> 27.99)。但是我想最好避免使用它,因为更可靠的方法已经可以使用,并且代码也更简洁。

因此,改用它
(改编自Louis Wasserman的回答和Sean Owen的回答。)

public static double round(double value, int places) {    if (places < 0) throw new IllegalArgumentException();    BigDecimal bd = BigDecimal.valueOf(value);    bd = bd.setScale(places, RoundingMode.HALF_UP);    return bd.doublevalue();}

注意,这HALF_UP是“学校常用”的舍入模式。细读的RoundingMode文件,如果你怀疑你需要别的东西,如银行家舍入。

当然,如果你愿意,可以将以上内容内联为单行:

new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doublevalue()

而且在每种情况下

永远记住,浮点表示使用float和double是不精确的。例如,考虑以下表达式:

999199.1231231235 == 999199.1231231236 // true1.03 - 0.41 // 0.6200000000000001

为了精确起见,你想使用BigDecimal。同时,使用带String的构造函数,而不要带double的构造函数。例如,尝试执行以下命令:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

关于该主题的一些出色的进一步阅读:

  • 项目48:Joshua Bloch撰写的Effective Java(第二版)中的“避免float并且double如果需要确切的答案”
  • 每个程序员应了解的浮点运算法则
    如果你希望使用字符串格式而不是(或除了)严格舍入数字,请参阅其他答案。

具体来说,请注意

round(200, 0)
return
200.0
。如果要输出“ 200.00 ”,则应首先取整,然后格式化输出的结果(这在Jesper的答案中有很好的解释)。



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

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

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