我正在尝试执行以下代码:
import java.math.*;
public class HelloWorld{
public static void main(String []args){
System.out.println(BigDecimal.valueOf(Double.NaN));
}
}
合理地,我得到:
Exception in thread "main" java.lang.NumberFormatException
at java.math.BigDecimal.<init>(BigDecimal.java:470)
at java.math.BigDecimal.<init>(BigDecimal.java:739)
at java.math.BigDecimal.valueOf(BigDecimal.java:1069)
at HelloWorld.main(HelloWorld.java:6)
有没有办法在BigDecimal中表示Double.NaN?
有没有办法在BigDecimal中表示Double.NaN?
不。 BigDecimal
类不提供 NaN、+∞ 或 -∞ 的表示形式。
您可以考虑使用null
...除了您至少需要1 个三个不同的值来表示 NaN、+∞ 或 -∞,而这在 null
中是不可能的。
您可以考虑创建一个处理这些"特殊"值的BigDecimal
子类。
你可以考虑将你的"数字"实现为BigDecimal
的包装器,并将NaN
等视为特例;例如
public class MyNumber {
private BigDecimal value;
private boolean isNaN;
...
private MyNumber(BigDecimal value, boolean isNaN) {
this.value = value;
this.isNaN = isNan;
}
public MyNumber multiply(MyNumber other) {
if (this.isNaN || other.isNaN) {
return new MyNumber(null, true);
} else {
return new MyNumber(this.value.multiply(other.value), false);
}
}
// etcetera
}
(以上仅供说明。 我会以不同的方式实现它。
<小时 />1 - IEEE 754 规范还定义了正浮点零点值和负浮点零值,并且有多个 NaN 值。 可以使用Float.floatToRawIntBits
和Double.doubleToRawLongBits
方法区分这些方法。
"NaN"代表"不是一个数字"。如果浮点数,则产生"Nan" 操作具有一些导致操作的输入参数 产生一些未定义的结果。例如,0.0 除以 0.0 为 算术上未定义。取负数的平方根 也是未定义的。
BigDecimal.valueOf(Double.NaN)
它试图将Double.NaN
转换为BigDecimal
,结果是数字无法转换为BigDecimal
即 java.lang.NumberFormatException
.
根据文档,这是不可能的,请参阅 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29
NaN = 不是一个数字。它不是一个数字,所以它不能转换为大十进制
你可以像这样重写你的代码:
public static void main(String []args){
Double d = ...;
String value;
if (Double.isNaN(d) == true) {
value= "My-NaN-formatting";
} else {
value=BigDecimal.valueOf(d);
}
System.out.println(value);
}