当前位置: 首页 > 知识库问答 >
问题:

需要使用大十进制数进行舍入

丰飞龙
2023-03-14

我想设置两个BigDecimal数字ab的比例。如本例所示:

BigDecimal a = new BigDecimal("2.6E-1095");
        BigDecimal b = new BigDecimal("2.7E-1105");
        int i = 112, j=1;

        BigDecimal aa = a.setScale(i+j);
        BigDecimal bb = b.setScale(i+j);

当我运行时,我有一个例外:

java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439)
    at java.math.BigDecimal.setScale(BigDecimal.java:2394)
    at java.math.BigDecimal.setScale(BigDecimal.java:2437)

为什么四舍五入是必要的?如果我不想让周围,什么是解决方案

谢谢

共有3个答案

诸龙野
2023-03-14

四舍五入是必要的。

在BigDecimal的javadoc中,它说BigDecimal表示为(uncaledValue×10-size),其中uncaledValue是一个仲裁长整数,而size是一个32位整数。

2.6*10-1095需要至少1096的刻度才能准确表示。它不能用(任何整数)*10-113精确表示。因此,您需要提供一种取整模式。

吴鸿彩
2023-03-14

尝试使用setScale方法的roudingMode

比如:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);
子车安和
2023-03-14

您有两个大的十进制数,它们都需要超过1000个小数位。试图将刻度设置为只有113位小数意味着您将失去精度,因此需要四舍五入。

可以使用采用舍入模式的setScale方法来防止异常,但不能防止舍入。

 类似资料:
  • 问题内容: Angular是否具有内置指令来舍入输入值? 在这种情况下,数字过滤器不合适,因为我也想在ng-model中也舍入实际值。如果我必须写一个,那会是什么样? 问题答案: 您可以使用指令创建双向绑定转换。这是一个简单的例子: http://plnkr.co/edit/kz5QWIloxnd89RKtfkuE?p=preview 这实际上取决于您希望它如何工作。是否应该限制用户输入?您介意模

  • 本文向大家介绍如何停止对MySQL十进制字段进行舍入?,包括了如何停止对MySQL十进制字段进行舍入?的使用技巧和注意事项,需要的朋友参考一下 您可以借助函数停止对十进制字段进行四舍五入。这是四舍五入的十进制字段的演示。对于我们的示例,让我们首先创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出 在上面的示例输出中,小

  • 我正在尝试用Java对BigDecimal进行四舍五入。下面是我执行的代码 因此,对于我的使用情形,输出为prec1 = 49.32和prec2 = 49.33,我需要始终舍入到49.33,那么除了设置两次比例之外,还有其他舍入到49.33的方法吗?

  • 问题内容: 我在MySQL中有一个表,该表的字段为小数,长度为9,无符号。我用它来定价。 在插入数据并查询之后,所有数据均已四舍五入,小数点已删除。 我对为什么感到困惑。 故障排除技巧? 主持人 :web.com phpMyAdmin版本 :2.11.10.1 MySQL客户端版本 :5.0.95 问题答案: MySQL中的小数类型有两个调整旋钮:精度和小数位数。您省略了小数位,因此默认为0。 文

  • 这个BigDecimalSorting的问题是什么?代码将数字作为字符串,然后将其转换为BigDecimal,然后排序并打印排序后的BigDecimals。 样本输入:9 -100 50 0 56.6 90 0.12 .12 02.34 000.000 预期产量:9056.6502.340.12.12000.000-100

  • 问题内容: 我试图将十进制数字截断到小数位。像这样: 所做的只是正确的事情,但是却舍入了价值。我不需要四舍五入的价值。希望这是可能的JavaScript。 问题答案: 更新 : 因此,无论如何,四舍五入的bug总是会困扰着您,无论您如何努力补偿它们。因此,应该通过精确地用十进制表示法来解决该问题。 旧的易出错的解决方案基于其他人的编译: