将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是什么?



加拿大宣布将不再铸造便士,美国财政部强烈考虑效仿!这意味着货币金额必须四舍五入到最接近的镍,因此需要大量的编程修改!。。在当铺业务中,我们一直将贷款金额四舍五入到最接近的5美元面额,例如50、55、60。当计算的贷款金额在50美元到100美元之间时,四舍五进到100美元以上的最接近的10美元面额,等等。这是一种常见的做法,目的是尽量减少使用较小面额的钞票。那么,哪种好的算法可以四舍五入到最接近的所需面额呢?

在SQL中,我可以创建一个用户定义的数据类型以四舍五入到n位吗?还是最好不使用十进制(8,2)数据类型并使用函数进行四舍五舍五入?

假设您的数字类似于:44.32,那么您所需要做的一切(这是伪代码,c++中的实现应该很简单):

findmod = (num_to_be_changed*100)%5
if findmod <= 2
  new_num = num_to_be_changed - findmod
else 
  new_num = num_to_be_changed +  (5 - findmod)
end
new_num = new_num/100

我很想在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_valuedouble,则在C++中可以使用相同的基本技术(如果它是float,则更令人怀疑,原因与SQL SMALLFLOAT有问题相同)。在C++或C中,您可以使用<cmath><math.h>标头来获得函数round()roundf()的声明。如果您使用的是ESQL/C和dec_t,那么您需要decround(&dec_value, 0);

在ESQL/C中,您必须提供要舍入到的位数,并且还必须对乘法和除法进行编码。假设你有一个包含值20的十进制值dec_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()没有返回值来进行错误检查。使用其中一个输入作为最后一行的输出是安全的。

这本身不是问题的技术答案,而是需要考虑的一点。你可能会发现你的"程序性修改"是虚幻的。

当澳大利亚在20世纪90年代逐步淘汰1美分和2美分硬币时,金额的四舍五入只对现金交易进行,现在仍然如此。信用卡付款按美分计费。同样,电话费和其他公用事业费也按美分计费,但当(而且只有当)在柜台上用现金支付时,四舍五入到最接近的5c。当然,股票交易和货币兑换仍然是以几美分或几便士为单位进行的。

因此,如果你可以假设四舍五入的现金交易数量(以1、2、6或7c结尾的)与四舍五进的数量(3、4、8或9c)大致相同,那么唯一的影响是收银机在一天结束时可能会少出几美分。事实上,它更有可能上涨几美分,因为所有单项交易都将被四舍五入(例如,每购买3.99美元,收银台中的金额为4.00美元)

没有任何编程更改来支持逐步淘汰便士。您可以选择在打印的摘要上显示四舍五入的金额,但认为任何人都有小型Y2K或欧元实施问题是不正确的。

最新更新