标签: bigdecimal

ArithmeticException:"非终止十进制扩展;没有可精确表示的十进制结果"

为什么以下代码会引发下面显示的异常?

BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.
Run Code Online (Sandbox Code Playgroud)

-

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
Run Code Online (Sandbox Code Playgroud)

java bigdecimal arithmeticexception

480
推荐指数
6
解决办法
29万
查看次数

Double vs. BigDecimal?

我必须计算一些浮点变量,我的同事建议我使用BigDecimal而不是double因为它会更精确.但我想知道它是什么以及如何最大限度地利用它BigDecimal

java floating-point double bigdecimal

272
推荐指数
6
解决办法
28万
查看次数

比较BigDecimal是否大于零

如果BigDecimal值大于零,我该如何比较?

java compare bigdecimal

227
推荐指数
4
解决办法
26万
查看次数

将BigDecimal舍入为*always*有两个小数位

我正在尝试将BigDecimal值向上舍入到小数点后两位.

我正在使用

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);
Run Code Online (Sandbox Code Playgroud)

但它不能始终如一地做我想做的事:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.73
rounded 0.819 to 0.82
Run Code Online (Sandbox Code Playgroud)

我不关心有效数字,我只想要两位小数.我如何使用BigDecimal执行此操作?或者是否有另一个类/库更适合这个?

java math rounding bigdecimal

198
推荐指数
1
解决办法
18万
查看次数

如何将DecimalFormat的小数分隔符从逗号更改为点/点?

我有一个小的疯狂方法,将BigDecimal值转换为漂亮可读的字符串.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}
Run Code Online (Sandbox Code Playgroud)

然而,它还产生了一个所谓的分组分隔符",",它使我的所有值都出现如下:

xxx,xxx
Run Code Online (Sandbox Code Playgroud)

我确实需要分隔符是点或点而不是逗号.有没有人知道如何完成这个小壮举?

我已阅读,尤其是这个,现在死,但我无法找到一个方法来完成这件事.我是以错误的方式接近这个吗?这样做有更优雅的方式吗?甚至可能是一个解决不同本地数字表示的解决方案,因为逗号将完全符合欧洲标准.

java android decimal-point bigdecimal decimalformat

192
推荐指数
5
解决办法
24万
查看次数

如何在java中检查BigDecimal变量== 0?

我在Java中有以下代码;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

写if条件的最佳方法是什么?

java bigdecimal

189
推荐指数
7
解决办法
21万
查看次数

使用Streams添加BigDecimals

我有一个BigDecimals的集合(在这个例子中,a LinkedList)我想加在一起.是否可以使用流?

我注意到这个Stream课有几种方法

Stream::mapToInt
Stream::mapToDouble
Stream::mapToLong
Run Code Online (Sandbox Code Playgroud)

每个都有一个方便的sum()方法.但是,我们知道,floatdouble算术几乎总是一个坏主意.

那么,有没有一种方便的方法来总结BigDecimals?

这是我到目前为止的代码.

public static void main(String[] args) {
    LinkedList<BigDecimal> values = new LinkedList<>();
    values.add(BigDecimal.valueOf(.1));
    values.add(BigDecimal.valueOf(1.1));
    values.add(BigDecimal.valueOf(2.1));
    values.add(BigDecimal.valueOf(.1));

    // Classical Java approach
    BigDecimal sum = BigDecimal.ZERO;
    for(BigDecimal value : values) {
        System.out.println(value);
        sum = sum.add(value);
    }
    System.out.println("Sum = " + sum);

    // Java 8 approach
    values.forEach((value) -> System.out.println(value));
    System.out.println("Sum = " + values.stream().mapToDouble(BigDecimal::doubleValue).sum());
    System.out.println(values.stream().mapToDouble(BigDecimal::doubleValue).summaryStatistics().toString());
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在总结BigDecimals BigDecimal::doubleValue(),但这(正如预期的那样)并不准确.

后代的回答后编辑:

这两个答案都非常有帮助.我想补充一点:我的现实场景不涉及原始集合BigDecimal,它们包含在发票中.但是,通过使用map()流的功能,我能够修改Aman Agnihotri的答案以解决这个问题: …

java bigdecimal java-8 java-stream

158
推荐指数
5
解决办法
11万
查看次数

BigDecimal的补充

我想用BigDecimal类型表示的一些货币值做一些简单的总和.

BigDecimal test = new BigDecimal(0);
System.out.println(test);
test.add(new BigDecimal(30));
System.out.println(test);
test.add(new BigDecimal(45));
System.out.println(test);
Run Code Online (Sandbox Code Playgroud)

显然我不太了解BigDecimal算术,看后面的输出.

Test
0
0
0
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?

java bigdecimal

147
推荐指数
5
解决办法
21万
查看次数

BigDecimal等于()与compareTo()

考虑简单的测试类:

import java.math.BigDecimal;

/**
 * @author The Elite Gentleman
 *
 */
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigDecimal x = new BigDecimal("1");
        BigDecimal y = new BigDecimal("1.00");
        System.out.println(x.equals(y));
        System.out.println(x.compareTo(y) == 0 ? "true": "false");
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以(有意识地)说它x等于y(不是对象引用),但是当你运行程序时,以下结果显示:

false
true
Run Code Online (Sandbox Code Playgroud)

问:什么是之间的区别compareTo(),并equals()BigDecimalcompareTo可以确定x等于y

PS:我看到BigDecimal在inflate()方法上有一个equals()方法.inflate()实际上做了什么?

java equals bigdecimal compareto

141
推荐指数
1
解决办法
11万
查看次数

BigDecimal setScale和round

这两个电话有什么区别?(有没有?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

java bigdecimal

132
推荐指数
2
解决办法
18万
查看次数