double减法不准确的那些事儿

CREATE TABLE `helei` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `num1` double DEFAULT NULL,
  `num2` double DEFAULT NULL,
  `num3` decimal(5,3) DEFAULT NULL,
  `num4` decimal(5,3) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

mysql> select * from helei;
+----+------+------+-------+-------+
| id | num1 | num2 | num3  | num4  |
+----+------+------+-------+-------+
|  1 |    1 |    1 | 1.000 | 1.000 |
|  2 |    2 |    2 | 2.000 | 2.000 |
|  3 |    3 |    4 | 3.000 | 4.000 |
|  4 |    6 |    5 | 6.000 | 5.000 |
|  5 |  3.3 |  4.4 | 3.300 | 4.400 |
|  6 |  6.6 |  5.5 | 6.600 | 5.500 |
+----+------+------+-------+-------+
6 rows in set (0.00 sec)

mysql> select (num2-num1)num5,(num4-num3)num6 from helei;
+---------------------+--------+
| num5                | num6   |
+---------------------+--------+
|                   0 |  0.000 |
|                   0 |  0.000 |
|                   1 |  1.000 |
|                  -1 | -1.000 |
|  1.1000000000000005 |  1.100 |
| -1.0999999999999996 | -1.100 |
+---------------------+--------+
6 rows in set (0.00 sec)

可以看到double列的减法出现了问题,我们可用demical替换即可

时间: 2024-11-05 06:28:14

double减法不准确的那些事儿的相关文章

NSDecimalNumber用于精度准确的计算

在处理金额计算时,往往会涉及到小数,由于Double类型不准确,无法做到产品的要求.为了保证金额计算的准确性,建议使用NSDecimalNumber. 1.创建对象(常用的方法) // mantissa:长整型数值:exponent:指数(几次方):flag:正负数. + (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BO

double精度的坑与BigDecimal

近期经常接触支付相关的功能,在开发及测试过程中,开始金额都使用的是double类型,而近期新进的需求存在支付时打折的情况,也就是会出现如 1.23元的情况,那么这时候问题来了,如果是直接使用1.23进行支付都是不存在问题的.而偏偏在支付前通常需要一些计算.我们的系统支持会员余额与三方支付(微信.支付宝)同时进行,比如一笔待支付的订单是12.8员,其中用户有5块钱的会员余额,剩下的7.8元通过三方支付进行(这里使用微信吧),那么就涉及到double减法,同时微信支付时需要将元转为分,就是7.8x1

hive支持sql大全

转自:http://www.aboutyun.com/thread-7316-1-1.html 一.关系运算:1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例:hive>select 1 from lxw_dual where 1=1; 2. 不等值比较: <> 语法: A <> B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL:如果表达式A与

Hive函数大全

一.关系运算: 1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive> select 1 from lxw_dual where 1=1; 1 2. 不等值比较: <> 语法: A <> B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL:如果表达式A与表达式B不相等,则为TRUE:否则为FALSE 举例: hive> select

hive的UDF 函数(User-Defined-Function)

UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容. 关系运算 等值比较: = 语法: A = B 操作类型: 所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive> select 1 from dual where 1=1; 1 不等值比较: <> 语法: A <> B 操作类型: 所有基本类型 描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL:如果表达式A与表达式B不相等,则为T

hive 函数大全

一.关系运算: 1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述:如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive>select 1 from lxw_dual where 1=1; 1 2. 不等值比较: <> 语法: A <> B 操作类型:所有基本类型 描述:如果表达式A为NULL,或者表达式B为NULL,返回NULL:如果表达式A与表达式B不相等,则为TRUE:否则为FALSE 举例: hive> select1 fr

OJ提交题目中的语言选项里G++与C++的区别(转载)

原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式.准确地说,选择C++的话,意味着你将使用的是最标准的编译方式,也就是ANSI C++编译.如果你使用的是G++的话,意味着你将使用GNU项目中最平凡适用人群最多的编译器(其实也就是

java作业2

(一) 仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? 结论:枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象.相同的值则引用同一个对象. (二) 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 11

课程作业02

第一题 1.动手动脑: 仔细阅读示例: EnumTest.java,运行它,分析运行结果? 源代码: public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t); //是原始数据类型吗?  不是 System.out.println(s.getClass().isPrimit