有张桌子,
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中,双重类型有什么区别?
在java中,如果使用BigDecimal可以得到正确的结果。
System.out.println(BigDecimal.valueOf(1100.00).add(BigDecimal.valueOf(1396.32)).equals(BigDecimal.valueOf(2496.32)));//true在Java中,mysql中的双倍实际上等于BigDecimal吗?
发布于 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不会舍弃结果,因此可能会计算出最后一点略有不同的结果。
发布于 2016-02-01 02:23:18
在mysql和java中,双重类型有什么区别?
简单地说:在MySQL的声明(11,2) double(11,2)中,Java完全不了解它的部分。
不同之处在于,java的double是一种通用类型,它可以在4.9e-324和1.7e308之间存储任意值,而MySQL则为每个包含(小数点后的数字)部分的声明创建不同的double类型。
https://stackoverflow.com/questions/35122059
复制相似问题