javascript数字精度而不转换为字符串

ara*_*ant 1 javascript decimal rounding

我正在开发 REST API 并返回 JSON。其中一个字段称为submissionPercent,我需要它是一个数字,但精确到小数点后两位

  • 如果submissionPercent是20,我需要返回20.00。
  • 如果submissionPercent是20.238,我需要返回20.24。

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

如果可能的话,我该如何实现这一目标?

Jor*_*ing 5

var n = 20.238;

Math.round(n * 100) / 100
// => 20.24
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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