我正在从XML
读取货币到Java。
String currency = 135.69;
当我将其转换为BigDecimal
时,我得到:
System.out.println(new BigDecimal(135.69));
输出:
135.68999999999999772626324556767940521240234375.
为什么输出这么多数字呢?我怎么能避免这个?我想要的只是输出135.69。
答案 0 :(得分:61)
BigDecimal(double)构造函数有一些问题,最好使用BigDecimal(String)或BigDecimal.valueOf(double)。
System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69
BigDecimal(double)文档解释了这种行为:
- 此构造函数的结果可能有些不可预测。有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它恰好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管有外观。
- 另一方面,String构造函数是完全可预测的:编写新的BigDecimal(" 0.1")会创建一个BigDecimal,它正好等于0.1,正如人们所期望的那样。因此,通常建议首先使用String构造函数。
- 当必须将double用作BigDecimal的源时,请注意此构造函数提供了精确的转换;它不会产生与使用Double.toString(double)方法将double转换为String然后使用BigDecimal(String)构造函数相同的结果。要获得该结果,请使用static valueOf(double)方法。
醇>
答案 1 :(得分:15)
String currency = "135.69";
System.out.println(new BigDecimal(currency));
//will print 135.69
答案 2 :(得分:3)
在 Java 中将 String 转换为 BigDecimal 的最简单方法是使用 BigDecimal(String) 构造函数:
String number = "123.45";
BigDecimal bigDecimal = new BigDecimal(number);
我们还可以使用 BigDecimal.valueOf(double) 方法将 String 转换为 BigDecimal。
这是一个两步过程。第一步是将String 转换为Double。第二步是将Double 转换为BigDecimal:
String number = "123.45";
BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf(number));
当表示值的 String 具有更复杂的格式时,我们可以使用 DecimalFormat。
例如,我们可以在不删除非数字符号的情况下转换基于十进制的 long 值:
BigDecimal bigDecimal = new BigDecimal(123456.789).setScale(3, BigDecimal.ROUND_HALF_UP);
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(',');
symbols.setDecimalSeparator('.');
String pattern = "#,##0.0#";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);
// parse the string value
BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("123,456.789");
assertEquals(bigDecimal, parsedStringValue);
DecimalFormat.parse 方法返回一个 Number,我们使用 setParseBigDecimal(true)< 将其转换为 BigDecimal 数字/em>;
通常,DecimalFormat 比我们需要的更高级。因此,我们应该支持新的 BigDecimal(String) 或 BigDecimal.valueOf()。
答案 3 :(得分:2)
我可以添加一些东西。如果你使用货币,你应该使用Scale(2),你应该找出一个圆形方法。
答案 4 :(得分:2)
您正在以货币形式存储135.69作为String。但是,您没有传递可变货币,而是再次将135.69(双值)传递给新的BigDecimal()。 因此,您在输出中看到很多数字。 如果传递currency变量,则输出为135.69
答案 5 :(得分:1)
BigDecimal b = BigDecimal.valueOf(d);
import java.math.*;
public class Test {
public static void main(String[] args)
{
// Creating a Double Object
Double d = new Double("785.254");
/// Assigning the bigdecimal value of ln to b
BigDecimal b = BigDecimal.valueOf(d);
// Displaying BigDecimal value
System.out.println("The Converted BigDecimal value is: " + b);
}
}
答案 6 :(得分:0)
Spring Framework提供了一个出色的utils类来实现这一目标。
实用程序类:NumberUtils
字符串到BigDecimal的转换-
NumberUtils.parseNumber("135.00", BigDecimal.class);
答案 7 :(得分:-3)
您好,您不能直接将字符串转换为bigdecimal
您需要先将其转换为很长的时间,然后您才能转换为大十进制
String currency = "135.69";
Long rate1=Long.valueOf((currency ));
System.out.println(BigDecimal.valueOf(rate1));