有一张桌子,
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中的两个加倍,
System.out.println(1100.00 + 1396.32); //2496.3199999999997
System.out.println((1100.00 + 1396.32) == 2496.32); //false
所以两者都是两倍,为什么在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中的两倍是否等于Java中的BigDecimal?
答案 0 :(得分:1)
mysql和java中double类型的区别是什么?
MySQL DOUBLE
和Java Double
之间没有区别。
使用MySQL' DOUBLE(m,n)
时会有所不同,因为这会限制价值(见下文)。
实际上mysql中的两倍是否等于Java中的BigDecimal?
不,MySQL数据类型DECIMAL(m,n)
在功能上比Java BigDecimal
更接近,除了MySQL限制了值(见下文)。
价值限制
Java double
存储IEEE 64位双精度支持的完整精度,BigDecimal
完全不受约束。
相比之下,MySQL的DOUBLE(m,n)
和DECIMAL(m,n)
将值限制为m
个总数位,小数点后面有n
个数字。
如DOUBLE(m,n)
:
MySQL在存储值时执行舍入,因此如果您将
999.00009
插入FLOAT(7,4)
列,则大致结果为999.0001
。
小数约束n
也用于在显示时格式化值。
至于1100.00 + 1396.32
的计算,MySQL说:
结果的精度是具有最大精度的操作数的精度。
这意味着加法的结果四舍五入为2位小数,这在使用近似数值数据类型DOUBLE
时会有所不同。 Java没有对结果进行舍入,因此可能会计算出最后一位略有不同的结果。
答案 1 :(得分:0)
以及mysql和java中double类型的区别是什么?
很快:Java对MySQL的声明(11,2)
中的double(11,2)
部分一无所知。
不同之处在于java的double
是通用类型,可以在4.9e-324
和1.7e308
之间存储任意值,而MySQL创建不同的{{1}每个声明的类型包括(总数,小数点后的数字)部分。