javascript number precision without converting to String

折月煮酒 提交于 2019-12-29 02:11:10

问题


I am developing a REST API and returning JSON. One of the fields is called submissionPercent and I need it to be a number but with exactly 2 decimal places

  • If the submissionPercent is 20, I need to return 20.00.
  • If the submissionPercent is 20.238, I need to return 20.24.

But submissionPercent should be a number not a String. If I use toFixed or toPrecision, then what I get is a String.

If possible, how do I achieve this?


回答1:


var n = 20.238;

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

Or more generally:

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

As others have pointed out, 20 and 20.00 are exactly the same, so if you want the user to see two digits after the decimal point even if they're zero, you'll have to use a string formatting function like toFixed.

In the case of a JSON API, it's up to the consumer to decide how to store the value upon decoding it. Even if you were to output JSON that said { val: 20.00 } a consumer will store it with whatever width it chooses. It might end up in a 32-bit float or a 64-bit float. It might end up in a string. It might end up in a MySQL database in a VARCHAR(6) column. You can't control how the consumer treats your data, and this is by design.

There is no advantage to outputting { val: 20.00 } over { val: 20 } or { val: 20.00000 } or { val: 2000e-2 }. If you want the API consumer to assume two digits of precision, you should put that information in your API documentation. I would encourage this, as it will help other developers make decisions when implementing API clients.



来源:https://stackoverflow.com/questions/21711600/javascript-number-precision-without-converting-to-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!