首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql和java中的double有什么区别?

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

Stack Overflow用户
提问于 2016-02-01 02:11:47
回答 2查看 4.6K关注 0票数 2

有张桌子,

代码语言:javascript
复制
CREATE TABLE `double_test` (
  `price` double(11,2) DEFAULT NULL
)

有两项记录:

代码语言:javascript
复制
select * from double_test;
+---------+
| price   |
+---------+
| 1100.00 |
| 1396.32 |
+---------+

并把它们加起来:

代码语言:javascript
复制
select sum(price) from double_test;
+------------+
| sum(price) |
+------------+
|    2496.32 |
+------------+

用Java把两倍相加,

代码语言:javascript
复制
System.out.println(1100.00 + 1396.32); //2496.3199999999997
System.out.println((1100.00 + 1396.32) == 2496.32); //false

所以两者都是双倍为什么在mysql中能得到正确的结果呢?在mysql和java中,双重类型有什么区别?

在java中,如果使用BigDecimal可以得到正确的结果。

代码语言:javascript
复制
     System.out.println(BigDecimal.valueOf(1100.00).add(BigDecimal.valueOf(1396.32)).equals(BigDecimal.valueOf(2496.32)));//true

在Java中,mysql中的双倍实际上等于BigDecimal吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-01 02:53:05

mysql和java中的双重类型有什么区别?

MySQL DOUBLE和Java Double之间没有区别。

但是,在使用MySQL的DOUBLE(m,n)时有一个不同之处,因为这限制了值(见下文)。

在Java中,mysql中的双倍实际上等于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
EN

Stack Overflow用户

发布于 2016-02-01 02:23:18

在mysql和java中,双重类型有什么区别?

简单地说:在MySQL的声明(11,2) double(11,2)中,Java完全不了解它的部分。

不同之处在于,java的double是一种通用类型,它可以在4.9e-324和1.7e308之间存储任意值,而MySQL则为每个包含(小数点后的数字)部分的声明创建不同的double类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35122059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档