我正在将XML
中的货币读入Java。
String currency = "135.69";
当我将它转换为 BigDecimal
时,我得到的结果是:
System.out.println(new BigDecimal(135.69));
输出:
135.68999999999999772626324556767940521240234375.
为什么输出这么多数字?我该如何避免这种情况?我只想让它输出135.69。我正在将XML
中的货币读入Java。
String currency = "135.69";
当我将它转换为 BigDecimal
时,我得到的结果是:
System.out.println(new BigDecimal(135.69));
输出:
135.68999999999999772626324556767940521240234375.
为什么输出这么多数字?我该如何避免这种情况?我只想让它输出135.69。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中编写new BigDecimal(0.1)将创建一个与0.1完全相等(无标度值为1,标度为1)的BigDecimal,但实际上它等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能准确地表示为double(或者说,不能准确地表示为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管表象如此。
- 另一方面,String构造函数则是完全可预测的:编写new BigDecimal("0.1")将创建一个完全等于0.1的BigDecimal,正如人们所期望的那样。因此,通常建议使用String构造函数而不是此构造函数。
- 当必须将double用作BigDecimal的源时,请注意,此构造函数提供精确转换;它不会像使用Double.toString(double)方法将double转换为字符串,然后使用BigDecimal(String)构造函数那样得到相同的结果。要获得该结果,请使用静态的valueOf(double)方法。
String currency = "135.69";
System.out.println(new BigDecimal(currency));
//will print 135.69
new BigDecimal("42.0")
列为符合规范的解决方案!它提到的应该使用的替代方案是自动装箱(无法与BigDecimal一起使用)和valueOf()
(没有接受String
参数的方法)。 - undefined我可以补充一些内容。如果您正在使用货币,应该使用Scale(2),并且可能需要确定一个四舍五入的方法。
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);
}
}
Spring Framework提供了一个出色的utils类来实现这一点。
Utils类:NumberUtils
将String转换为BigDecimal -
NumberUtils.parseNumber("135.00", BigDecimal.class);
大家好,你不能直接将字符串转换为BigDecimal。
你需要先将它转换成长整型,然后再转换为BigDecimal。
String currency = "135.69";
Long rate1=Long.valueOf((currency ));
System.out.println(BigDecimal.valueOf(rate1));
new BigDecimal("135.69")
;
(2) "将其转换为long类型" - 对于像135.69
这样的小数,这是不可能的。 - undefined
currency
的类型是字符串吗?而且你只读取了字符串的值? - Rohit JainString
,你可以使用BigDecimal
构造函数,并将一个String
作为参数传入。 - fge