Java 四舍五入双数据类型,最多3位

Java 四舍五入双数据类型,最多3位,java,math,Java,Math,我试图计算一个代表利率的字段的值,我必须将该值四舍五入到3位 下面是我正在使用的代码: double bigAmt1 = Double.parseDouble(amount); bigAmt = (intsign*bigAmt1)/div; bigAmt=Math.round(bigAmt*1000d)/1000d; amount = 4048500 intsign = 1 div = 6 它返回=4.048 我需要它返回=4

我试图计算一个代表利率的字段的值,我必须将该值四舍五入到3位

下面是我正在使用的代码:

double bigAmt1 = Double.parseDouble(amount);
            bigAmt = (intsign*bigAmt1)/div;
            
        bigAmt=Math.round(bigAmt*1000d)/1000d;

amount = 4048500
intsign = 1
div = 6
它返回=4.048 我需要它返回=4.049

如果我将amount的值改为4048600,那么它返回4.049,所以我认为它是对除法后最后一位大于5的值进行四舍五入,但如果最后一位等于或大于5,那么它应该四舍五入到下一位

下面是我的测试课--


你为什么不使用
Math.ceil()
,而不是
Math.round()
,我想这就是它的用途。

Math.round
应该可以工作,但我通常是这样做的:

bigAmt=Math.floor((bigAmt*1000d)+0.5d)/1000d;
但你的问题在别处:

bigAmt1 = Double.parseDouble(amount);
bigAmt = (intsign*bigAmt1)/div;
bigAmt=Math.round(bigAmt*1000d)/1000d;
因此,利用你的价值观:

amount = 4048500
intsign = 1
div = 6

bigAmt1 = 4048500;
bigAmt = (1*4048500)/6 = 674750;
bigAmt=   round(674750*1000)/1000 = round(674750000)/1000 = 674750;
但是在您的示例中,您写道:
it returns=4.048我需要它return=4.049
那么您是否有相同的
div
值? 如果div为
1000000
,则:

bigAmt1 = 4048500;
bigAmt = (1*4048500)/1000000 = 4.048500;
bigAmt=   round(4.048500*1000)/1000 = round(4048.500)/1000 = 4.049;
但是有一个大问题,因为浮点可能会将
4.048500
数字四舍五入为类似
4.04849999999
。直接使用整数舍入更安全:

1000* ((amount+500)/1000)
1000* ((4048500+500)/1000)
1000* ((4049000    )/1000)
1000* (4049)
       4049000

所以,将舍入值的一半相加,除以舍入值,然后乘以舍入值。对整数进行所有运算

这是否回答了您的问题@Amongalen——感谢您的回复,但不幸的是,我已经检查过了,它并没有将等于5的值舍入到下一个数字。事实上,BigDecimal的用法更为详细(
.add
,.
multiply
);使用诸如`new BigDecimal(“4.048500”)之类的字符串构造函数。问题是,数学,四舍五入(计算4048.5)可能四舍五入4048.4999998.try BigDecimal;BigDecimal b=新的BigDecimal(金额);系统输出打印LN(b.setScale(0,舍入模式上限))@brijesh——我也尝试过这种方法,但它是将最后一个小于5的值向上舍入到下一个数字,比如amount=4048300,然后它给出4.049,而在这种情况下它应该给出4.048。我尝试使用math.ceil()但它是四舍五入的,即使最后一个值小于5到下一个数字,比如amount=4048300,那么它给出的是4.049,而在这个例子中它应该给出4.048case@mradul圆形/天花板/地板不是问题。。。问题是浮点舍入,您需要对整数算术进行舍入,并将结果存储为double…主要问题是存在
1.5
,但没有
1.05
1.005
,。。。浮点数。。。而且只使用了最接近的(稍微少一点的)二进制表示数…哦,我明白了,很抱歉误解了你的问题,我找到后会告诉你的
1000* ((amount+500)/1000)
1000* ((4048500+500)/1000)
1000* ((4049000    )/1000)
1000* (4049)
       4049000