mysql和java中double的区别是什么?

时间:2016-02-01 02:11:47

标签: java mysql

有一张桌子,

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?

2 个答案:

答案 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-3241.7e308之间存储任意值,而MySQL创建不同的{{1}每个声明的类型包括(总数小数点后的数字)部分。