第一种方式:
import java.math.BigDecimal;public class DoubleAdd {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(Double.toString(1.15));
BigDecimal b2 = new BigDecimal(Double.toString(1.20));
System.out.println(b1.add(b2).doubleValue()); //output : 2.35
}
}第二种方式:import java.math.BigDecimal;public class DoubleAdd {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(1.15);
BigDecimal b2 = new BigDecimal(1.20);
System.out.println(b1.add(b2).doubleValue()); //output : 2.3499999999999996
}
}为什么会这个样子?
import java.math.BigDecimal;public class DoubleAdd {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(Double.toString(1.15));
BigDecimal b2 = new BigDecimal(Double.toString(1.20));
System.out.println(b1.add(b2).doubleValue()); //output : 2.35
}
}第二种方式:import java.math.BigDecimal;public class DoubleAdd {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(1.15);
BigDecimal b2 = new BigDecimal(1.20);
System.out.println(b1.add(b2).doubleValue()); //output : 2.3499999999999996
}
}为什么会这个样子?
解决方案 »
- 如何用java读取一个网页源文件中两个字符串之间的内容
- 紧急! 散分了! 用iText怎样将已生成好的word文档复制到另外一个文件夹中
- 初学者求救!
- 大家帮忙呀!!!我错在那里?????不防行一下试试呀!!!!!!!!!
- 点击“esc”后自动关闭窗口(窗口里有jTextField控件的)
- 请帮忙看看这个怎么回事?warning: [unchecked] unchecked call to put(K,V) as.....
- 用jb写方法时,为什么光标不会在当前字符的后面?
- 为何用同一个Statement获得多个ResultSet时,前面的记录集就不可用了?
- JAVA到底用来干什么,一般使用什么编辑工具!
- InputStream
- 转义字符
- 方法重载编译出错
构造方法不同引起的。
将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
BigDecimal(String val)
将 BigDecimal 的字符串表示形式转换为 BigDecimal。
API
Translates the string representation of a BigDecimal into a BigDecimal.
BigDecimal(double val)
Translates a double into a BigDecimal which is the exact decimal representation of the double's binary floating-point value.
继续分析
该小数由小数点以及后跟的零或更多十进制数字组成。字符串必须至少包含整数或小数部分中的一个数字。由符号、整数和小数部分组成的数字称为有效位数。 指数由字符 'e'('\u0065') 或 'E' ('\u0045') 以及后跟的一个或多个十进制数字组成。指数的值必须位于 Integer.MAX_VALUE (Integer.MIN_VALUE+1) 和 Integer.MAX_VALUE(包括)之间。 更正式地说,以下语法描述了此构造方法接受的字符串: BigDecimalString:
Signopt Significand Exponentopt Sign:
+
- Significand:
IntegerPart .FractionPartopt
. FractionPart
IntegerPart IntegerPart:
Digits FractionPart:
Digits Exponent:
ExponentIndicator SignedInteger ExponentIndicator:
e
E SignedInteger:
Signopt Digits Digits:
Digit
Digits Digit Digit:
Character.isDigit(char) 对其返回 true 的任何字符,如 0、1、2……
返回的 BigDecimal 的标度将是小数部分中的数字位数,如果该字符串不包含小数点,则标度为零,这取决于对指数的调整;如果字符串包含一个指数,则从标度减去该指数。得到的标度值必须位于 Integer.MIN_VALUE 和 Integer.MAX_VALUE(包括)之间。 Character.digit(char, int) 集提供从字符到数字的映射,以转换成基数 10。该字符串不能包含任何额外字符(例如,空白)。 示例:
返回的 BigDecimal 的值等于有效位数 × 10 指数。对于左边的每个字符串,得到的表示形式 [BigInteger, scale] 显示在右边。 "0" [0,0]
"0.00" [0,2]
"123" [123,0]
"-123" [-123,0]
"1.23E3" [123,-1]
"1.23E+3" [123,-1]
"12.3E+7" [123,-6]
"12.0" [120,1]
"12.3" [123,1]
"0.00123" [123,5]
"-1.23E-12" [-123,14]
"1234.5E-4" [12345,5]
"0E+7" [0,-7]
"-0" [0,0]
注:对于不是 float、double NaN 和 ±Infinity 的值,此构造方法与 Float.toString(float) 和 Double.toString(double) 返回的值兼容。这通常是将 float 或 double 转换为 BigDecimal 的首选方法,因为它不会遇到 BigDecimal(double) 构造方法的不可预知问题。
参数:
val - BigDecimal 的字符串表示形式。
抛出:
NumberFormatException - 如果 val 不是 BigDecimal 的有效表示形式。
public BigDecimal(double val)将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。
注: 此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。
当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。 参数:
val - 要转换为 BigDecimal 的 double 值。
抛出:
NumberFormatException - 如果 val 为无穷大或 NaN。
BigDecimal(double val)
此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。
这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。