Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的BigDecimal_Java_Bigdecimal - Fatal编程技术网

Java中的BigDecimal

Java中的BigDecimal,java,bigdecimal,Java,Bigdecimal,我正在考虑使用BigDecimal来比较两个四舍五入为2位的货币值。例如,我希望下面的结果是0,因为我正在比较应该四舍五入到0.02的值和0.02的值。但是它会产生-1!!有没有正确的方法 这也适用于较大的数字,如123.45对123.4534。。。当使用“compareTo”时,该值应为0 我试过使用数学上下文,但它看起来并不优雅。。。有正确的方法吗 BigDecimal spread = new BigDecimal(0.01934); spread.setScale(2, Rounding

我正在考虑使用BigDecimal来比较两个四舍五入为2位的货币值。例如,我希望下面的结果是0,因为我正在比较应该四舍五入到0.02的值和0.02的值。但是它会产生-1!!有没有正确的方法

这也适用于较大的数字,如123.45对123.4534。。。当使用“compareTo”时,该值应为0

我试过使用数学上下文,但它看起来并不优雅。。。有正确的方法吗

BigDecimal spread = new BigDecimal(0.01934);
spread.setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02)));
解决办法是:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread));

首先,BigDecimal是不可变的。您必须返回setScale方法调用的结果:

spread = spread.setScale(2, RoundingMode.HALF_EVEN);
接下来,您必须提高第二个BigDecimal的精度,因为它是从一个double派生的,而不是一个非常精确的实体。因此,请尝试一个字符串:

 spread.compareTo(new BigDecimal("0.02"))

0.02将被评估为

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875

您还必须在那里设置刻度(2,舍入模式。半偶数)。

这是获得准确浮点数的另一种方法。1+。必须在这里同时使用这两种想法才能使其正确。将发布正确的代码。这实际上用于比较价格。它们可能必须从double中实例化。@fodon:那么user unknown为您提供了部分答案,而我有另一部分答案(关于BigDecimal是不可变的)。我还原了无效的编辑。各位,如果您对看到的答案不满意,请发表评论或提供额外的答案。