为了账号安全,请及时绑定邮箱和手机立即绑定

四舍五入小数位到小数点2位

四舍五入小数位到小数点2位

大话西游666 2019-06-01 16:13:51
四舍五入小数位到小数点2位如果值是200.3456,则应格式化为200.34..如果是的话200,那应该是200.00.
查看完整描述

4 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

这里有一个实用程序子弹(而不是截断)双到指定的小数位数。

例如:

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)。但是我想最好避免它,因为更可靠的方法是现成的,还有更干净的代码。

所以,用这个代替

(改编自这是路易斯·沃瑟曼的回答这张是肖恩·欧文写的.)

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(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 // true1.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")));

关于这一专题的一些极好的进一步阅读:


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

具体来说,请注意round(200, 0)回报200.0..如果你想输出“200.00“,您应该先进行一轮,然后格式化输出结果(如杰斯珀的回答).


查看完整回答
反对 回复 2019-06-01
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果您只想打印一个double对于小数点之后的两个数字,请使用如下所示:

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

如果希望在String与其打印到控制台,不如使用String.format()同样的论点:

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

或使用类DecimalFormat:

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


查看完整回答
反对 回复 2019-06-01
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

最简单的方法,就是做这样的把戏;

double val = ....;val = val*100;val = Math.round(val);val = val /100;

如果Val从200.3456开始到20034.56,那么它被四舍五入到20035,然后除以得到200.34。

如果您希望总是舍入整数,则可以通过转换为int来截断:

double val = ....;val = val*100;val = (double)((int) val);val = val /100;

这种技术在大多数情况下都是可行的,因为对于非常大的双倍(正或负),它可能会溢出。但是,如果您知道您的值将在一个适当的范围内,那么这应该适用于您。


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 604 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号