加拿大宣布他们将不再类型转换便士,美国财政部正在强烈考虑效仿!这意味着货币金额必须四舍五入到最接近的五分之一,因此需要大量的编程修改!..在当铺业务中,我们一直将贷款金额四舍五入到最接近的 5 美元面额,例如50, 55, 60.. 当计算出的贷款介于 50 美元和 100 美元之间时,到 100 美元以上最接近的 10 美元面额等。这是为了尽量减少使用较小面额钞票的常见做法。那么四舍五入到最接近的所需面额的好算法是什么?
在 SQL 中,我可以创建一个用户定义的数据类型来四舍五入到 n 面额,还是最好单独保留小数 (8,2) 数据类型并使用函数四舍五入?
最佳答案
我很想在 SQL 中使用:
new_val = ROUND(old_value * 20) / 20;
当镍币走美分之路时,那么:
new_val = ROUND(old_value * 10) / 10;
这在带有 DECIMAL 或 NUMERIC 值的 SQL 中工作正常;它也适用于 SQL FLOAT,但与 SQL SMALLFLOAT 的可靠性稍差(只是因为 SMALLFLOAT 可能只有大约 6 个十进制数字的准确度)。如果
old_value
是 double
(如果它是 float
则更可疑,因为 SQL SMALLFLOAT 有问题的原因相同),可以在 C++ 中使用相同的基本技术。在 C++ 或 C 中,您将使用 <cmath>
或 <math.h>
header 来获取函数 round()
或 roundf()
的声明。如果您使用 ESQL/C 和 dec_t
,那么您需要 decround(&dec_value, 0);
。在 ESQL/C 中,您已经提供了四舍五入的位数,并且还必须对乘法和除法进行编码。假设你有一个十进制值
dec_20
包含值 20
,你会写:dec_t new_val;
decmul(&old_val, &dec_20, &new_val);
decround(&new_val, 0);
decdiv(&new_val, &dec_20, &new_val);
您可能会错误检查
decmul()
和 decdiv()
; decround()
没有返回值来进行错误检查。使用其中一个输入作为最后一行的输出是安全的。关于c++ - 将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9952643/