我看到了类似问题here和here的一些答案。似乎每个人都建议使用DECIMAL类型来定价。但是,由于一般价格不会低于1美分,我可以通过将单位从“美元”改为“美分”来使用INT类型的价格吗?例如7.99美元与799美分相同。
对于存储空间,读/写速度,使用函数时的性能(MIN,MAX,SUM等)或其他方面,选择INT而非DECIMAL(9,2)是否有任何优势?
答案 0 :(得分:1)
我建议将最小适用单位的货币值表示为普通的旧整数。通常情况下,美元这意味着使用美分,但有时你可能需要使用更小的单位。这种情况的一个例子就是支付5%的交易佣金,每笔交易只有几美分,否则四舍五入会将它们变为零。在这种情况下,使用“millicents”可能会更好。
虽然固定位置DECIMAL(9,2)
列会忠实地保留值,但您正在使用的应用程序平台可能不会很好地对待它们,如果您不小心,可能会导致奇怪的浮点行为。
必须在美元和内部单位之间进行转换以代表它们可能有点烦人,但这远不如向会计解释所有这些钱都丢失的情况那么烦人。
就性能而言,默认情况下,INT
值是最快的。一般而言,它们也是最紧凑的。如果您需要存储超过+/- 2.1B的值,这可能是您处理大量美元时,您将需要使用BIGINT。这可能会出现问题,如果您的应用程序脚本语言没有准备好,可能会将它们渲染为浮动并导致问题。
与往常一样,使用较大的和小值彻底测试您的代码。
答案 1 :(得分:-2)
我建议使用美分因为浮动很难管理计算机。例如,如果我能记得js中的0,1 + 0,2将不会返回0,3。
因此,特别是在处理金钱时,我会说最好使用美分。
编辑:也许我还不够清楚。看看tadman留下的长篇评论,它以更详细的方式解释了我的想法。
问题是选择int超过其他方面是否有任何优势。我的答案是肯定的,这是肯定的,因为当您处理脚本中的信息时(由于数据库通常不单独使用会发生什么),最好使用int来操纵钱。有点不可能吗?也许,这取决于你有多宽容。它应该得到-1吗?我不这么认为。