为什么以下代码会引发下面显示的异常?
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) 我必须计算一些浮点变量,我的同事建议我使用BigDecimal而不是double因为它会更精确.但我想知道它是什么以及如何最大限度地利用它BigDecimal?
我正在尝试将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执行此操作?或者是否有另一个类/库更适合这个?
我有一个小的疯狂方法,将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中有以下代码;
BigDecimal price; // assigned elsewhere
if (price.compareTo(new BigDecimal("0.00")) == 0) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
写if条件的最佳方法是什么?
我有一个BigDecimals的集合(在这个例子中,a LinkedList)我想加在一起.是否可以使用流?
我注意到这个Stream课有几种方法
Stream::mapToInt
Stream::mapToDouble
Stream::mapToLong
Run Code Online (Sandbox Code Playgroud)
每个都有一个方便的sum()方法.但是,我们知道,float和double算术几乎总是一个坏主意.
那么,有没有一种方便的方法来总结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的答案以解决这个问题: …
我想用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)
谁能帮我吗?
考虑简单的测试类:
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()在BigDecimal该compareTo可以确定x等于y?
PS:我看到BigDecimal在inflate()方法上有一个equals()方法.inflate()实际上做了什么?
这两个电话有什么区别?(有没有?)
// 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)