如何将十进制值拆分为两个十进制值。如果小数部分的小数部分小于 .50 或大于 .50 。它应该以这样的方式拆分,即第一个 no 应该仅以 .00 或 .50 结尾。第二个值应包含剩余的阶乘值。
ex. 19.97 should return 19.50 & 0.47
19.47 19.00 & 0.47
如何将十进制值拆分为两个十进制值。如果小数部分的小数部分小于 .50 或大于 .50 。它应该以这样的方式拆分,即第一个 no 应该仅以 .00 或 .50 结尾。第二个值应包含剩余的阶乘值。
ex. 19.97 should return 19.50 & 0.47
19.47 19.00 & 0.47
您可以通过乘以 2、调用FLOOR
、然后除以 2 来“地板”到 0.5 的最高倍数。从那里只需从原始值中减去该值即可得到余数。
DECLARE @test decimal(10,7)
SELECT @test =19.97
SELECT
FLOOR(@test * 2) / 2 AS base,
@test - FLOOR(@test * 2) / 2 AS fraction
或减少重复
SELECT
base,
@test - base AS fraction
FROM ( SELECT FLOOR(@test * 2) / 2 AS base )
Declare @money money
Set @money = 19.97
Select convert(int,@money - (@money % 1)) as 'LeftPortion'
,convert(int, (@money % 1) * 100) as 'RightPortion'
观察加倍0.5
得到1
,这是一个整数。这导致了一个简单的算法:
floor(x)
使用and将其拆分为一个整体和一个小数部分x-floor(x)
让我们以您的数字为例:
19.97 * 2 = 39.94
Whole part = 39, fractional part = 0.94
Dividing each part by 2 individually, we get
39/2 = 19.50
0.94/2 = 0.47
19.47 * 2 = 38.94
Whole part = 38, fractional part = 0.94
Dividing each part by 2 individually, we get
38/2 = 19.00
0.94/2 = 0.47
SELECT
19.97 as myDecVal ,
19.97 % 0.5 AS decGreaterThan50,/*should return 0.47*/
19.97- (19.97 % 0.5) as roundedToNearestZeroPoint5 /*should return 19.50*/;