首页 > Java >  Java 将双精度舍入到小数点后 2 位

 Java 将双精度舍入到小数点后 2 位

上一篇 下一篇

如何在 Java中将数字四舍五入到小数点后 n 位 (39 答案)

8年前关闭。

如果值为 ,则应将其格式设置为 。
如果是 ,则应该是 。
200.3456200.34200200.00

分割线

网友回答:

这是一个实用程序,可将双精度舍(而不是截断)到指定的小数位数。

例如:

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;
}

这在小数位数非常高(例如)或大整数部分(例如)的极端情况下会严重分解。感谢斯洛因指出这一点。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

当然,如果您愿意,可以将上述内容内联到一行中:
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()

在每种情况下

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

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

为了准确起见,您希望使用 BigDecimal。在使用它时,使用接受字符串的构造函数,而不是采用双精度的构造函数。例如,尝试执行以下命令:

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(第2版)floatdouble
  • 每个程序员都应该知道的关于浮点运算的知识

如果您想要字符串格式而不是(或除了)严格舍入数字,请参阅其他答案。

具体而言,请注意返回 .如果要输出“200.00”,则应先将结果进行四舍五入,然后再格式化输出(这在Jesper的答案中得到了完美的解释)。round(200, 0)200.0

分割线

网友回答:

如果您只想打印小数点后两位数的 a,请使用如下所示的内容:double

double value = 200.3456;
System.out.printf("Value: %.2f", value);

如果要将结果打印到 a 而不是打印到控制台,请使用相同的参数:StringString.format()

String result = String.format("%.2f", value);

或使用类:DecimalFormat

DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));

分割线

网友回答:

我认为这更容易:

double time = 200.3456;
DecimalFormat df = new DecimalFormat("#.##");      
time = Double.valueOf(df.format(time));

System.out.println(time); // 200.35

请注意,这实际上将为您进行舍入,而不仅仅是格式化。

模板简介:该模板名称为【 Java 将双精度舍入到小数点后 2 位】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 289次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-23
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 企业网站 html5 微信公众平台 微信素材 微信文章 微信图片 响应式 自适应 微信模板
您可能会喜欢的其他模板