java - mysql和java中的double有什么区别?

标签 java mysql

有一张 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 a FLOAT(7,4) column, the approximate result is 999.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/

相关文章:

java - 按符号(正、零、负)对 int 数组进行排序,无需排序方法

java - 如何解决优先队列池?这是最好的选择吗?

在没有参数的情况下调用存储过程时,Mysql 错误 #1064 接近 Null

php mysql查询出所有单词,但不重复

mysql - 在 WHILE 循环中 INSERT 未插入数据库

mysql - 两个表mysql之间水平到垂直的数据透视表

java - 从 Optional 返回值

c++ - try/catch block 中的完整代码

MySQL:根据不同的列减去不同的行

java - 为报告设置数字格式模式以保留小数点后的所有数字