首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >前端和后端计算不同的金额?计算是否应在同一地点进行?

前端和后端计算不同的金额?计算是否应在同一地点进行?
EN

Stack Overflow用户
提问于 2022-04-01 15:42:55
回答 2查看 971关注 0票数 0

因此,我有一个网站的问题,我的工作。它是这样的(注意:这并不完全是发生的事情。我只是画一幅画):

前端:

  1. 用户有一辆装满了他们想买的东西的购物车。
  2. 前端计算应该支付的金额(以折扣、销售、购买一次等方式计算)
  3. 用户提交并支付金额

后端:

  1. 物品被买了,钱也收到了
  2. 后端为每件事的成本计算不同的金额。
  3. 后端想要更多或更少的钱

我想我应该在同一个地方计算金额。我认为在第二步,我可以打个电话到后端,以确定金额应该是多少。

那样的话,我就不会遇到这样的问题,他们正在计算两个不同的金额。你们觉得怎么样?

EN

回答 2

Stack Overflow用户

发布于 2022-04-05 14:28:00

如果您的前端是用JavaScript或某种转录到JavaScript的语言实现的,那么您应该避免使用任何重要的业务计算(例如支付金额)。JavaScript逻辑在浏览器中很容易操作,因此所有关键代码都需要在后端服务器中执行。

您应该按照您的建议做,并在步骤2.中调用后端。

这还将使系统更容易维护,因为您不会在两个地方重复逻辑,任何有关此逻辑的重构或调试都可以在代码库中的单个位置进行。

票数 1
EN

Stack Overflow用户

发布于 2022-04-03 18:53:37

这可能是舍入和浮动数字的问题。当使用不同的编程语言时,可以不同地定义表示数字的舍入函数和系统。您可以使用库使用十进制数字,也可以尝试为一方实现舍入行为以匹配另一方。然后总是建议尽可能多地用整数来计算。在开始时乘以100,在计算结束时除以100,有助于稳定数字。此外,在舍入货币时,您应该考虑使用bankers round (也称为Half Even舍入)作为一种策略,以尽量减少总失败。

对于TypeScript,函数可以是:

代码语言:javascript
运行
复制
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关于四舍五入是使用样本数据的最重要的舍入方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71709548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档