【问题标题】:javascript number precision without converting to Stringjavascript数字精度而不转换为字符串
【发布时间】:2014-02-11 19:49:52
【问题描述】:

我正在开发一个 REST API 并返回 JSON。其中一个字段称为submissionPercent,我需要它是一个数字,但正好有2个小数位

  • 如果提交百分比是20,我需要返回20.00。
  • 如果提交百分比是20.238,我需要返回20.24。

但submissionPercent 应该是一个数字而不是一个字符串。 如果我使用toFixedtoPrecision,那么我得到的是一个字符串。

如果可能,我该如何实现?

【问题讨论】:

  • 20.0020 是同一个数字。
  • No 20.12 将保持原样
  • someNumber = +(someNumber).toFixed(2); Source
  • 您需要区分格式化数字和存储数字。两者完全不同。
  • @arahant , ik , 我正在向 Bergi 解释

标签: javascript decimal rounding


【解决方案1】:
var n = 20.238;

Math.round(n * 100) / 100
// => 20.24

或更笼统地说:

function roundWithPrecision(num, precision) {
  var multiplier = Math.pow(10, precision);
  return Math.round( num * multiplier ) / multiplier;
}

roundWithPrecision(20.238, 2)
// => 20.24

roundWithPrecision(20.238, 1)
// => 20.2

正如其他人指出的那样,2020.00 完全相同,因此如果您希望用户看到小数点后的两位数字,即使它们为零,您也必须使用字符串格式化函数,如toFixed

在 JSON API 的情况下,由消费者决定如何在解码时存储该值。即使您要输出表示{ val: 20.00 } 的 JSON,消费者也会以它选择的任何宽度存储它。它可能以 32 位浮点数或 64 位浮点数结束。它可能以字符串结尾。它可能最终出现在VARCHAR(6) 列中的 MySQL 数据库中。您无法控制消费者如何处理您的数据,这是设计使然。

{ val: 20 }{ val: 20.00000 }{ val: 2000e-2 } 相比,输出{ val: 20.00 } 没有任何优势。如果您希望 API 使用者假设两位数的精度,您应该将该信息放入您的 API 文档中。我会鼓励这样做,因为它将帮助其他开发人员在实现 API 客户端时做出决策。

【讨论】:

  • 是的。但是对于 20,它给了我 20 而不是 20.00,正如我希望的那样。
  • 注意:如果您需要较大的精度数字,则乘法、舍入和除法会缩小可用的数值范围。
  • "20.00" 只能是String 的可能格式,这是@Bergi 试图解释的。
  • @arahant 在什么情况下?在任何意义上,20 20.00,反之亦然。 var num = 20完全var num = 20.00相同
  • @arahant 在 JSON API 的情况下,消费者将决定如何在内部表示数字。这是设计使然。如果您想确保编写 API 客户端的开发人员知道预期非整数值,您应该在 API 文档中包含该信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2011-05-26
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多