据我所知四舍五入一般有两种规则
1. 四舍五入, 就是我们小学学的 不多说
2. 四舍六入五凑偶
2.1 当计算位<>5 : 四舍六入
2.2 当计算位=5 :
是否为末位?
是: 前一位为偶数? 舍去 否则 进位
否: 进位
请解释以下现象
- SQL code
DECLARE @f1 FLOATSET @f1 = 1.575SELECT @f1 , ROUND(@f1, 2)DECLARE @f2 FLOATSET @f2 = 1.475SELECT @f2 , ROUND(@f2, 2)DECLARE @f3 FLOATSET @f3 = 1.275SELECT @f3 , ROUND(@f3, 2)
---------------------- ----------------------
1.575 1.57
(1 行受影响)
---------------------- ----------------------
1.475 1.48
(1 行受影响)
---------------------- ----------------------
1.275 1.27
(1 行受影响)
------解决方案--------------------
不用float,用decimal
------解决方案--------------------
- SQL code
DECLARE @f1 decimal(18,2)SET @f1 = 1.575SELECT @f1 , ROUND(@f1, 2)DECLARE @f2 decimal(18,2)SET @f2 = 1.475SELECT @f2 , ROUND(@f2, 2)DECLARE @f3 decimal(18,2)SET @f3 = 1.175SELECT @f3 , ROUND(@f3, 2) --/////////////////// DECLARE @f1 numeric(18,2)SET @f1 = 1.575SELECT @f1 , ROUND(@f1, 2)DECLARE @f2 numeric(18,2)SET @f2 = 1.475SELECT @f2 , ROUND(@f2, 2)DECLARE @f3 numeric(18,2)SET @f3 = 1.175SELECT @f3 , ROUND(@f3, 2)
------解决方案--------------------
float 本身就是近似值,用decimal,如果保证小数点位数不超过4位,money是不二的选择
------解决方案--------------------
问题出在float类型上,float本身存储数据就是不准确的,你赋值是1.575可能实际上是1.574768655.。。建议使用DECIMAL类型的存储
------解决方案--------------------
DECLARE @f1 FLOAT
SET @f1 = 1.575
SELECT @f1-- ,ROUND(@f1, 2)
DECLARE @f2 FLOAT
SET @f2 = 1.475
SELECT @f2-- , ROUND(@f2, 2)
DECLARE @f3 FLOAT
SET @f3 = 1.275
SELECT @f3 --,ROUND(@f3, 2)
/*
-----------------------------------------------------
1.575
(所影响的行数为 1 行)
-----------------------------------------------------
1.4750000000000001
(所影响的行数为 1 行)
-----------------------------------------------------
1.2749999999999999
(所影响的行数为 1 行)
------解决方案--------------------