有一张 table ,
CREATE TABLE `double_test` (
`price` double(11,2) DEFAULT NULL
)
并且有两条记录:
select * from double_test;
+---------+
| price |
+---------+
| 1100.00 |
| 1396.32 |
+---------+
并对它们求和:
select sum(price) from double_test;
+------------+
| sum(price) |
+------------+
| 2496.32 |
+------------+
然后在 Java 中对两个 double 求和,
System.out.println(1100.00 + 1396.32); //2496.3199999999997
System.out.println((1100.00 + 1396.32) == 2496.32); //false
那么两者都是double 为什么在mysql 中可以得到正确的结果? mysql 和 java 中的 double 类型有什么区别?
在java中如果使用BigDecimal可以得到正确的结果,例如
System.out.println(BigDecimal.valueOf(1100.00).add(BigDecimal.valueOf(1396.32)).equals(BigDecimal.valueOf(2496.32)));//true
实际上mysql中的double等于Java中的BigDecimal吗?
最佳答案
what's the difference of double type in mysql and java?
MySQL DOUBLE
和 Java Double
没有区别。
然而,使用 MySQL 的 DOUBLE(m,n)
时会有所不同。 ,因为这限制了值(value)(见下文)。
Is actually double in mysql equal to BigDecimal in Java?
不是,MySQL数据类型DECIMAL(m,n)
在功能上更接近 Java 的 BigDecimal
,除了 MySQL 限制了值(见下文)。
值(value)约束
Java 的 double
存储 IEEE 64 位 double 支持的完整精度,而 BigDecimal
是完全不受约束的。
相比之下,MySQL 的 DOUBLE(m,n)
和 DECIMAL(m,n)
将值限制为 m
总位数,其中n
小数点后的数字。
如 DOUBLE(m,n)
所述:
MySQL performs rounding when storing values, so if you insert
999.00009
into aFLOAT(7,4)
column, the approximate result is999.0001
.
小数约束 n
也用于在显示时格式化值。
关于1100.00 + 1396.32
的计算,MySQL说:
the precision of the result is the precision of the operand with the maximum precision.
这意味着加法的结果四舍五入到 2 位小数,这在使用近似数字数据类型 DOUBLE
时会有所不同。 Java 不会对结果进行舍入,因此可能会计算出最后一位略有不同的结果。
关于java - mysql和java中的double有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35122059/