据我所知,当四舍五入为5时,四舍五入应按以下方式进行。
2.435 => 2.44 (Round Up, if rounding to digit(3) is odd number)
2.445 => 2.44 (Round Down, if rounding to digit(4) is even number)
如果我们做所有的总结,
2.435 + 2.445 = 4.88
2.44 + 2.44 = 4.88
我很确定在.Net中也可以进行这种四舍五入。
但是在SQL Server中,总会四舍五入,这在数学上是不正确的。
SELECT round(2.345, 2) = 2.35
SELECT round(2.335, 2) => 2.34
这导致四舍五入后的总值相差1美分。
2.345 + 2.335 = 4.68
2.35 + 2.34 = 4.69 => which is not correct
我已经尝试过使用十进制和货币数据类型。
难道我做错了什么?有没有解决的办法?
如果您确实想在SQL Server中使用银行取整…
CREATE FUNCTION BankersRounding(@value decimal(36,11), @significantDigits INT)
RETURNS MONEY
AS
BEGIN
-- if value = 12.345 and signficantDigits = 2...
-- base = 1000
declare @base int = power(10, @significantDigits + 1)
-- roundingValue = 12345
declare @roundingValue decimal(36,11) = floor(abs(@value) * @base)
-- roundingDigit = 5
declare @roundingDigit int = @roundingValue % 10
-- significantValue = 1234
declare @significantValue decimal(36,11) = floor(@roundingValue / 10)
-- lastSignificantDigit = 4
declare @lastSignificantDigit int = @significantValue % 10
-- awayFromZero = 12.35
declare @awayFromZero money = (@significantValue + 1) / (@base / 10)
-- towardsZero = 12.34
declare @towardsZero money = @significantValue / (@base / 10)
-- negative values handled slightly different
if @value < 0
begin
-- awayFromZero = -12.35
set @awayFromZero = ((-1 * @significantValue) - 1) / (@base / 10)
-- towardsZero = -12.34
set @towardsZero = (-1 * @significantValue) / (@base / 10)
end
-- default to towards zero (i.e. assume thousandths digit is 0-4)
declare @rv money = @towardsZero
if @roundingDigit > 5
set @rv = @awayFromZero -- 5-9 goes away from 0
else if @roundingDigit = 5
begin
-- 5 goes to nearest even number (towards zero if even, away from zero if odd)
set @rv = case when @lastSignificantDigit % 2 = 0 then @towardsZero else @awayFromZero end
end
return @rv
end
有人能向我解释为什么以下代码: 给出以下输出? 以防您没有看到:“6.2089”四舍五入为3位给出输出“6.208”,而“6.2088”给出“6.209”作为输出。少即是多? 当使用Java 5、6或7时,结果很好,但这个Java 8给了我这个奇怪的输出。Java版本: 编辑:这是Java7的输出: Java7版本:
本节讨论了精度数学的四舍五入特性,ROUND()函数,以及插入DECIMAL列时的四舍五入特性。 ROUND()函数的行为取决于其参量是准确的还是近似的: ·对于准确值数值,ROUND()采用“半值向上舍入”规则:如果小数部分的值为.5或更大,如果是正数,向上取下一个整数,如果是负数,向下取下一个整数(换句话讲,以0为界限执行舍入)。如果小数部分的值小于.5,如果是正数,向下取下一个整数,如果是负
问题内容: 我怎么总是将a舍入为一个,而不舍入它。我知道,但是我希望它总是四舍五入。因此,如果为,则四舍五入为4。 问题答案: 您可以使用方法。 请参阅JavaDoc链接:https ://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double ) 从文档: 细胞 返回大于或等于自变量且等于数学整数的最小(最接近负无穷大
有人能告诉我怎么打双人球吗 e、 g.从双倍值55.6666666666667开始-四舍五入到双倍值56.0000000000- 或者从55.333333333333开始-四舍五入到55.0000000000的两倍- 谢谢。
问题内容: 现在我正在尝试: 在哪里,但它不起作用。我究竟做错了什么? 问题答案: 代码段中方法的返回类型是什么? 如果是这种方法,则当输入参数为Double时将返回Long。 因此,您将必须强制转换返回值:
问题 你想对浮点数执行指定精度的舍入运算。 解决方案 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可。比如: >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 >>> round(-1.27, 1) -1.3 >>> round(1.25361,3) 1.254 >>> 当一个值刚好在两个边界的中间的时候, round