我需要转换一个十进制值并将.1添加到它。我的问题是,如果这个价值成为' .5'价值,它需要向上舍入到下一个整数。
例如:如果我的值为' 3.1'这将成为' 3.2' 如果我的值为' 5.3'这将成为5.4' 如果我的值为&#;; 6.4'这将成为' 7.0'
我目前使用案例陈述这样做,所以如果' .X' part是4,它增加了0.6,否则它增加了1,但是有更高效/更好的方法吗?
当前代码示例:
declare @Example Decimal (5,1) = '4.4'
select case when @Example like '%.4' then (@Example + '0.6')
else @Example + '0.1' end
谢谢!
答案 0 :(得分:2)
如果它是小数,那么你应该使用为小数制作的函数,并且尽可能不转换为字符串。以下是模数的使用方法。
DECLARE @Table TABLE (nums DECIMAL(5,1))
INSERT INTO @Table
VALUES (3.1),(5.3),(6.4)
SELECT nums,
CASE
WHEN nums % 1 < .4 THEN nums + .1
ELSE CEILING(nums)
END AS new_num
FROM @Table
结果:
nums new_num
--------------------------------------- ---------------------------------------
3.1 3.2
5.3 5.4
6.4 7.0
答案 1 :(得分:1)
假设负值不是问题:
<script>
$(document).ready(function(){
$('ul.tabs li').click(function(){
var tab_id = $(this).attr('data-tab');
$('ul.tabs li').removeClass('current');
$('.tab-content').removeClass('current');
$(this).addClass('current');
$("#"+tab_id).addClass('current');
})
})
</script>
不是说这是一个好主意,但它完成了工作。
答案 2 :(得分:0)
您可以使用floor(x)获取整数部分(左侧),使用(x%1)获取小数部分。然后你可以将两者加在一起(如果是小数部分&lt; .4)或者将1加到整数部分(如果小数部分&gt; = .4):
select FLOOR(@Example) + (case when @Example % 1 >= .4 then 1 else @Example % 1 end)
答案 3 :(得分:0)
注意:我不确定所有的回答者都按照您的意图处理小数值。我的版本将0.4视为四舍五入的截止值。分数分量在0.4和0.9之间的所有值都以相同的方式处理。
在没有CASE
阻止的情况下进行此操作并非不可能。我怀疑这也不是最短的表达。
declare @t as table (d decimal(5, 1) not null);
insert into @t
values (2.0), (2.1), (2.2), (2.3), (2.4), (2.5), (2.6), (2.7), (2.8), (2.9);
select d, d + 0.1 + (round(-0.8 + d % 1, 0) + 1) * (0.9 - d % 1)
from @t;
我假设数字是正数,因为你没有指定关于否定的行为。
至于另一种舍入方法:这在代数上与其他答案等价,但逻辑可能更明显。
d + 0.1 + 0.5 * (1 - abs(sign(d % 1 - 0.4)))
这是另一个基于函数的表达式。当然,coalesce
内部会扩展为case
表达式。
floor(d) + 0.1 + coalesce(nullif(d % 1, 0.4), 0.9)
您的方法的问题在于隐式转换。在那些演员阵容中,你假设点字符始终是小数点。
编辑:
如果您确定输入的小数部分从未超过0.4,那么我可以想到另一个简单的计算。
d + 0.1 + floor(d % 1 * 2.5) * 0.5
在SQL平台具有case
表达式之前,这些小技巧更有用。我认为这些选项确实不具备任何效率优势。