【发布时间】:2022-08-10 22:59:57
【问题描述】:
我有这个 BigDecimal 数字 - 68.65121847597993,我想像这样舍入它 - 68.7,所以只有数字的小数部分会被舍入,而不是整数。
我尝试使用 RoundingMode.HALF_UP 但它也将整数四舍五入。 有没有办法使用java只舍入数字的小数部分?
-
您想实际修改数字还是简单地提供数字的四舍五入表示?
标签: java bigdecimal
我有这个 BigDecimal 数字 - 68.65121847597993,我想像这样舍入它 - 68.7,所以只有数字的小数部分会被舍入,而不是整数。
我尝试使用 RoundingMode.HALF_UP 但它也将整数四舍五入。 有没有办法使用java只舍入数字的小数部分?
标签: java bigdecimal
为了表示具有那么多小数点的数字,我假设您使用的是BigDecimal 而不是double,它只能准确地表示大约15 significant digits。
从BigDecimal 开始,您可以使用字符串、双精度数或其他任何您拥有的东西进行初始化,您可以调用BigDecimal::setScale 来获取您想要的值。
例如:
import java.math.*;
public class HelloWorld {
public static void main(String []args){
BigDecimal b = new BigDecimal("68.65121847597993");
BigDecimal rounded = b.setScale(2, RoundingMode.HALF_UP);
System.out.println(rounded); // 68.65
}
}
【讨论】:
double。
float 和double 与== 进行比较总是“在刀刃上”;-) 但我明白你的意思。我想 OP 从之前实际上使用双值的代码中复制了该数字,但也许我错了 - 所以你的回答真的很有帮助!
我会像几乎所有其他语言一样这样做:
double input = -68.65121847597993;
double rounded = Math.floor(input * 10.0 + 0.5)/10.0;
使用BigDecimal,您有更多选项,如舍入模式和setScale,如果您需要的话。
还有像decimal4j 或Apache Commons Math 这样的第三方库——尽管我没有测试它们。
【讨论】:
-68.7。这是由于 Math.floor() 的性质,它不会截断,而是向下舍入到下一个较小的整数,如果输入为 -687.0,则如本例所示,如果输入为 -686.0121847597993。
你应该试试这个
DecimalFormat df = new DecimalFormat("###.###");
这是一篇关于它的Baeldung文章: https://www.baeldung.com/java-round-decimal-number
希望能帮助到你!
【讨论】:
你不能真正做到这一点,因为浮点数和双打不是那样工作的。
但是,这可以解决您的问题:
round((-68.65121847597993)*10)/10f;
【讨论】:
double、int 和float 混为一谈:如果将结果再次分配给double,则除以10f 得出-68.69999694824219 的结果.仅将其分配给 float 会产生正确的结果。始终注意自动转换和混合数字类型。
如果您的值为双精度值,则此方法的编译时间最短:
Math.round(num * 10d) / 10d
0 的个数 = 小数位数
【讨论】:
尝试这个
BigDecimal bd = new BigDecimal(Double.toString(number));
bd = bd.setScale(decimalPlaces, RoundingMode.HALF_UP);
return bd.doubleValue();
【讨论】:
无需更改数字(因此其当前精度仍可用于后续计算),您可以按如下方式控制显示。
double v = 68.65121847597993;
System.out.printf("%.1f%n", v);
印刷
68.7
【讨论】: