- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 C 源代码,它有一个函数 RptRound()
用于各种报告,它采用两个值,一个数量和第二个值(例如计数),将它们相除,然后四舍五入结果。被分割的金额值通常是货币金额,例如美元乘以 100 得到美分。
我的问题是,如果 lAmount
和 sDivisor
的值均为负值,导致它们的除法结果为正,那么当前使用的函数是否会提供正确的舍入。
仔细研究四舍五入的主题,它似乎并不像我原先想象的那么简单。然而,这里的目的似乎是做一个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)。
但是在我看来,如果 lAmount
和 sDivisor
都是负数导致正结果,那么四舍五入将是不正确的偏差值, 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/
我正在尝试学习 Fortran,并且看到了很多不同的定义,我想知道他们是否正在尝试完成同样的事情。以下有什么区别? 整数*4 整数(4) 整数(kind=4) 最佳答案 在 Fortran >=90
我以前从未编程过,最近(1 周前)才开始学习!第一门类(class)是函数式编程,使用 Haskell。 我有一项学校作业,我想通过删除一两个步骤来改进它,但我遇到了一个讨厌的错误。 基本上,我创建了
给定以下GraphQL请求和变量: 请求: query accounts($filter:AccountFilter, $first_:String, $skip_:Int) { accounts
我已经搜索了 StackOverflow,但找不到关于如何检查计算器应用程序的数字输入正则表达式的答案,该计算器应用程序将检查每个 keyup 的以下格式(jquery key up): 任何整数,例
类似于我上一篇致歉的文章,但没有那么长篇大论。基本上我想知道当每次重绘调用只重绘屏幕的一小部分时,优化重绘到 JFrame/JPanel 的最佳选择是什么。 此外,除了重绘重载之外,我并不是 100%
所以在我的教科书中有一个使用 f# 的递归函数的例子 let rec gcd = function | (0,n) -> n | (m,n) -> gcd(n % m,m);; 使用此功能,我的教科书
我有一个数据结构,例如表达式树或图形。我想添加一些“测量”功能,例如depth和 size . 如何最好地键入这些函数? 我认为以下三个变体的用处大致相同: depth :: Expr -> Int
这样写比较好 int primitive1 = 3, primitive2 = 4; Integer a = new Integer(primitive1); Integer b = new Inte
我是 Java 8 新手,想根据键对 Map 进行排序,然后在值内对每个列表进行排序。 我试图寻找一种 Java 8 方法来对键和值进行排序。HashMap>映射 map.entrySet().str
这就是我的目标... vector ,int> > var_name (x, pair (y),int>); 其中 x 是 vector var_name 的大小,y 是对内 vector 的大小。
这里是 an answer to "How do I instantiate a Queue object in java?" , Queue is an interface. You can't i
这个问题在这里已经有了答案: Weird Integer boxing in Java (12 个答案) Why are autoboxed Integers and .getClass() val
我们可以使用 C++ STL 做这样的事情吗?如果是,我将如何初始化元素?我试图这样做,但没有成功。 pair,vector>p; p.first[0]=2; 最佳答案 Can we do som
您好,我正在尝试为百分比和整数数组中的数字找到索引。假设 arraynum = ['10%','250','20%','500'] 并且用户发送一个值 15%,这个数字在哪个范围内居住?我可以使用这段
我与三列有关系:ProductName、CategoryID 和 Price。我需要选择仅那些价格高于给定类别中平均产品价格的产品。(例如,当apple(ProductName)是fruit(Cate
我已经坚持了一段时间,我正在尝试将一些数据配对在一起。这是我的代码。 #include #include using namespace std; int main() { pair data(
我收到错误:'(Int, Int)' 与 'CGPoint' 不相同 如何将 (Int, Int) 转换为 CGPoint let zigzag = [(100,100), (100,150)
我在 .cpp 文件中发现了以下代码。我不理解涉及头文件的构造或语法。我确实认识到这些特定的头文件与 Android NDK 相关。但是,我认为这个问题是关于 C++ 语法的一般问题。这些在某种程度上
我将这些输入到 Scala 解释器中: val a : Integer = 1; val b : Integer = a + 1; 我收到消息: :5: error: type mismatch;
C++:vector>v(size);当我试图打印出值时显示 0 作为值,但是当未声明 vector 大小时它显示正确的输出?为什么这样?例如: int x; cin>>x; vector>v(x);
我是一名优秀的程序员,十分优秀!