因此,我有一个网站的问题,我的工作。它是这样的(注意:这并不完全是发生的事情。我只是画一幅画):
前端:
后端:
我想我应该在同一个地方计算金额。我认为在第二步,我可以打个电话到后端,以确定金额应该是多少。
那样的话,我就不会遇到这样的问题,他们正在计算两个不同的金额。你们觉得怎么样?
发布于 2022-04-05 14:28:00
如果您的前端是用JavaScript或某种转录到JavaScript的语言实现的,那么您应该避免使用任何重要的业务计算(例如支付金额)。JavaScript逻辑在浏览器中很容易操作,因此所有关键代码都需要在后端服务器中执行。
您应该按照您的建议做,并在步骤2.中调用后端。
这还将使系统更容易维护,因为您不会在两个地方重复逻辑,任何有关此逻辑的重构或调试都可以在代码库中的单个位置进行。
发布于 2022-04-03 18:53:37
这可能是舍入和浮动数字的问题。当使用不同的编程语言时,可以不同地定义表示数字的舍入函数和系统。您可以使用库使用十进制数字,也可以尝试为一方实现舍入行为以匹配另一方。然后总是建议尽可能多地用整数来计算。在开始时乘以100,在计算结束时除以100,有助于稳定数字。此外,在舍入货币时,您应该考虑使用bankers round
(也称为Half Even
舍入)作为一种策略,以尽量减少总失败。
对于TypeScript,函数可以是:
function roundHalfEven(x: number, d: number) {
const p = Math.pow(10, d);
const xp = x * p;
const r = Math.round(xp);
return (Math.abs(xp) % 1 == 0.5 && r % 2 != 0 ? r - 1 : r) / p;
}
const xp = x * p;
行也可以通过const xp = parseFloat((x * p).toPrecision(15))
使其更加稳定。
但也不要相信来自浏览器的任何东西。因此,您肯定应该在服务器的末尾检查是否所有的内容都是累加的。
您可以在以下页面找到有关舍入和如何处理失败的更多信息:
这个题目回答得很好,但是要知道,所有的东西都应该带点盐。例如,Math.round(-0.5)
的解决方案是-0
,而不是-1
,就像Alis中那样。
ICU关于四舍五入是使用样本数据的最重要的舍入方法。
https://stackoverflow.com/questions/71709548
复制相似问题