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

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

如果值是200.3456,则应格式化为200.34..如果是的话200,那应该是200.00.


大话西游666
浏览 605回答 4
4回答

慕斯王

这里有一个实用程序子弹(而不是截断)双到指定的小数位数。例如:round(200.3456,&nbsp;2);&nbsp;//&nbsp;returns&nbsp;200.35原始版本;注意这个public&nbsp;static&nbsp;double&nbsp;round(double&nbsp;value,&nbsp;int&nbsp;places)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(places&nbsp;<&nbsp;0)&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(); &nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;factor&nbsp;=&nbsp;(long)&nbsp;Math.pow(10,&nbsp;places); &nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;value&nbsp;*&nbsp;factor; &nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;tmp&nbsp;=&nbsp;Math.round(value); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(double)&nbsp;tmp&nbsp;/&nbsp;factor;}这,这个坏坏在具有极高小数位数的拐角处(例如:round(1000.0d, 17))或大整数部分(例如:round(90080070060.1d, 9))。感谢斯隆因为你指出了这个。多年来,我一直在使用上面提到的“不太大”的双倍到小数点2或3位(例如,为了日志记录目的在几秒钟内清理时间:27.987654321987->27.99)。但是我想最好避免它,因为更可靠的方法是现成的,还有更干净的代码。所以,用这个代替(改编自这是路易斯·沃瑟曼的回答和这张是肖恩·欧文写的.)public&nbsp;static&nbsp;double&nbsp;round(double&nbsp;value,&nbsp;int&nbsp;places)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(places&nbsp;<&nbsp;0)&nbsp;throw&nbsp;new&nbsp;IllegalArgumentException(); &nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;bd&nbsp;=&nbsp;new&nbsp;BigDecimal(value); &nbsp;&nbsp;&nbsp;&nbsp;bd&nbsp;=&nbsp;bd.setScale(places,&nbsp;RoundingMode.HALF_UP); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bd.doubleValue();}请注意HALF_UP是四舍五入的教学模式。仔细阅读圆模式文档,如果你怀疑你需要其他的东西,比如银行家四舍五入.当然,如果您愿意,可以将上面的内容内联成一行:new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()在任何情况下始终记住,浮点表示使用float和double是不准确..例如,考虑以下表达式:999199.1231231235&nbsp;==&nbsp;999199.1231231236&nbsp;//&nbsp;true1.03&nbsp;-&nbsp;0.41&nbsp;//&nbsp;0.6200000000000001为了准确起见,您想使用BigDecimal..在此过程中,使用接受字符串的构造函数,而不是接受双字符串的构造函数。例如,尝试执行以下操作:System.out.println(new&nbsp;BigDecimal(1.03).subtract(new&nbsp;BigDecimal(0.41)));System.out.println(new&nbsp;BigDecimal("1.03").subtract(new&nbsp;BigDecimal("0.41")));关于这一专题的一些极好的进一步阅读:项目48:“避免float和double如果需要确切的答案“有效Java(第二版)关于浮点算法,每个程序员都应该知道些什么?如果你想要字符串格式化而不是(或除了)严格四舍五入的数字,请参阅其他答案。具体来说,请注意round(200, 0)回报200.0..如果你想输出“200.00“,您应该先进行一轮,然后格式化输出结果(如杰斯珀的回答).

慕姐4208626

如果您只想打印一个double对于小数点之后的两个数字,请使用如下所示:double&nbsp;value&nbsp;=&nbsp;200.3456;System.out.printf("Value:&nbsp;%.2f",&nbsp;value);如果希望在String与其打印到控制台,不如使用String.format()同样的论点:String&nbsp;result&nbsp;=&nbsp;String.format("%.2f",&nbsp;value);或使用类DecimalFormat:DecimalFormat&nbsp;df&nbsp;=&nbsp;new&nbsp;DecimalFormat("####0.00");System.out.println("Value:&nbsp;"&nbsp;+&nbsp;df.format(value));

qq_笑_17

最简单的方法,就是做这样的把戏;double&nbsp;val&nbsp;=&nbsp;....;val&nbsp;=&nbsp;val*100;val&nbsp;=&nbsp;Math.round(val);val&nbsp;=&nbsp;val&nbsp;/100;如果Val从200.3456开始到20034.56,那么它被四舍五入到20035,然后除以得到200.34。如果您希望总是舍入整数,则可以通过转换为int来截断:double&nbsp;val&nbsp;=&nbsp;....;val&nbsp;=&nbsp;val*100;val&nbsp;=&nbsp;(double)((int)&nbsp;val);val&nbsp;=&nbsp;val&nbsp;/100;这种技术在大多数情况下都是可行的,因为对于非常大的双倍(正或负),它可能会溢出。但是,如果您知道您的值将在一个适当的范围内,那么这应该适用于您。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java