gpt4 book ai didi

c - 在一个整数除以另一个值可能为负的整数后对结果进行整数舍入的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:39 27 4
gpt4 key购买 nike

我正在使用 C 源代码,它有一个函数 RptRound() 用于各种报告,它采用两个值,一个数量和第二个值(例如计数),将它们相除,然后四舍五入结果。被分割的金额值通常是货币金额,例如美元乘以 100 得到美分。

我的问题是,如果 lAmountsDivisor 的值均为负值,导致它们的除法结果为正,那么当前使用的函数是否会提供正确的舍入。

仔细研究四舍五入的主题,它似乎并不像我原先想象的那么简单。然而,这里的目的似乎是做一个Round-Half-Up。舍入类型。或者更确切地说,从零开始的一半。但是,只有当除数 sDivisor 的值为正时,此函数才会这样做。

当前函数如下:

DCURRENCY RptRound( DCURRENCY lAmount, SHORT sDivisor )
{
if (sDivisor) { /* Not Divide 0 Case */
D13DIGITS Quot, Quot1;

if ( lAmount < 0 ) {
Quot1 = -5;
} else {
Quot1 = 5;
}
Quot = lAmount * 10;
Quot /= (LONG)sDivisor;
Quot += Quot1;
Quot /= 10;
return Quot;
}
return (0);
}

看起来只要 sDivisor 总是正数,那么这个函数就会给出正确的四舍五入结果,正值 x.5 四舍五入到 (x + 1) 以及-x.5 的负值向下舍入(更负)到 (x - 1)。

但是在我看来,如果 lAmountsDivisor 都是负数导致正结果,那么四舍五入将是不正确的偏差值, Quot1 应该为正时却为负。结果将是 x.5 将四舍五入为 x 而不是 x + 1 如果两者都是负数。或者更糟糕的是,如果 x.2 均为负数,则 x.2 将四舍五入为 x - 1。

所以我想用下面的替换上面的。

DCURRENCY RptRound( DCURRENCY lAmount, SHORT sDivisor )
{
D13DIGITS Quot = 0;

if (sDivisor) { /* Not Divide 0 Case */
Quot = lAmount;
Quot *= 10; // multiply by 10 with larger number of digits
Quot /= sDivisor;
// add the bias and divide now in case both lAmount and sDivisor are negative.
// this will get us to the closest whole number value of the result.
if ( Quot < 0 ) {
Quot += -5; // add half of -10 to make more negative
} else {
Quot += 5; // add half of +10 to make more positive
}
Quot /= 10; // divide by 10 to get to nearest whole number of result.
}

return Quot;
}

在这个版本中,如果 sDivisor 为负且 lAmount 为正,则结果从零四舍五入(结果为负且四舍五入更负),如果sDivisor 为负且 lAmount 为负(结果为正且四舍五入更正)。如果 sDivisor 为正且 lAmount 为正,则结果从零四舍五入(结果为正且四舍五入更正),如果 sDivisor 为正并且 lAmount 为负数,结果从零四舍五入(结果为负数,四舍五入更负)。

但是,经过一些阅读后,我对这一变化的确定程度大大降低,因此我正在寻找更多反馈。

注意:由于 DCURRENCY 当前是一个 long,此函数在对返回值进行转换时会生成编译器警告。一旦 DCURRENCY 变成与 D13DIGITS 相同的 long long,它就会消失。

warning C4244: 'return' : conversion from 'D13DIGITS' to 'DCURRENCY', possible loss of data

最佳答案

这里的负除数看起来有点奇怪,所以考虑一个有符号的和无符号的。带符号的函数只是对两个操作数取反。

不是按 10 缩放并加上 +/-5 再除以 10,而是加上除数的一半。

DCURRENCY RptRoundU(DCURRENCY lAmount, unsigned Divisor) {
if (Divisor > 0) {
if lAmount < 0) {
lAmount -= Divisor/2;
} else {
lAmount += Divisor/2;
}
lAmount /= (LONG) sDivisor;
return lAmount;
}
return 0;
}

DCURRENCY RptRoundS(DCURRENCY lAmount, signed Divisor) {
return Divisor < 0 ? RptRoundU(-lAmount, 0u-Divisor) : RptRoundU(lAmount, Divisor);
}

关于c - 在一个整数除以另一个值可能为负的整数后对结果进行整数舍入的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com