--短期解决方案--
感谢您提供的所有信息丰富的回复@PetrJaneček@Matt为我指出了正确的方向.我同意我必须温习一下我对浮点运算的理解;但是使用valueOf调用构造函数与double的规范字符串表示的区别解决了我的问题.
private static Double sampleRound(Double value, int places) {
BigDecimal bd1 = BigDecimal.valueOf(value);
bd1 = bd1.setScale(places, RoundingMode.HALF_UP);
return bd1.doubleValue();
}
由@PetrJaneček和有用的视频提供:
--原始问题--
关于舍入,我遇到了一个非常奇怪的问题,我只是想知道我错在哪里.
功能是:
private static Double sampleRound(Double value, int places) {
BigDecimal bd1 = new BigDecimal(value);
bd1 = bd1.setScale(places, RoundingMode.HALF_UP);
return bd1.doubleValue();
}
如果我传递值"1942.945",我希望它输出"1942.95",但我得到的是"1942.94".然而,如果我通过"1942.9451",我会得到"1942.95".好吧,那么让我们假设我将这个逻辑保留到小数点后3位.因此,如果我通过"1942.9445",我期望得到"1942.944",但我得到的是"1942.945",如何以及为什么?我觉得这个逻辑似乎不正确?
sampleRound(1942.945, 2) -> 1942.94
[Does NOT make sense, should be 1942.95]
sampleRound(1942.9450000000001, 2)-> 1942.95
*编辑:我也通过了这个(1个额外的零),我再次理解了数据类型及其约束,我想我要说的是分数.005不被视为半价>;=5: 根据java文档"丢弃的分数是≥ 0.5;"它本质上是将其视为>;0.5而不是>;=0.5*
sampleRound(1942.94500000000001, 2) -> 1942.94
[Then this should be equivalent to the top]
好的,但很好,我可以处理上述逻辑,但只要我做3位小数:
sampleRound(1942.9445, 3) -> 1942.945
[Does NOT make sense, in accordance with top logic should be 19423.944].
我希望通过描述可以理解,但我被难住了?
当做