【问题标题】:How can cut number at the second demical point? [duplicate]怎么能把小数点后二位的数字截断? [复制]
【发布时间】:2021-01-24 14:26:35
【问题描述】:

我有一个问题。

我的后端从前端收到数字字符串。

重要的是,我想在第二个小数点上删号。

ex1) '2.346' => 2.34

ex2) '2.3' => 2.3

ex3) '4.246' => 4.24

ex4) '4.1' => 4.1

当我使用“2.346”或“4.246”尝试此代码时

let v = '2.346'

v = parseInt(v * 100) / 100

console.log(v)
// v = 2.34

但是当我在 2.3 或 4.1 中尝试这段代码时,它会变得很奇怪......

let v = '2.3'

v = parseInt(v * 100) / 100

console.log(v)
// v = 2.29

我的代码有什么问题...?

【问题讨论】:

  • 您是浮点数没有无限精度这一事实的受害者。您实际上不能将某些数字表示为浮点数。

标签: javascript


【解决方案1】:

浮点精度意味着乘以相同的数字,然后再除以与 parseInt(v * 100) / 100 相同的数字,有时可能会有很长的尾随无意义的数字,而这些数字一开始就不存在。

如果我是你,我会使用正则表达式来匹配 . 之后最多 2 位数字:

const clean = str => str.match(/\d+(?:\.\d{1,2})?/)[0];

console.log(clean('2.346'));
console.log(clean('2.3'));

【讨论】:

  • 有趣——为什么是正则表达式而不是 JS 提供的 API?
  • toFixed 舍入,但 OP 不想要舍入。此外,OP 以字符串而不是数字开头,我喜欢在适当的时候使用正则表达式,所以这似乎是一种合理的方法。
  • 知道了。没有接受关于四舍五入的推论。谢谢。
【解决方案2】:

function tofixed(str){
  return parseInt(str * 1000 / 10) /100
}

console.log(tofixed("2.346"))
console.log(tofixed("2.3"))
console.log(tofixed("4.246"))
console.log(tofixed("4.1"))

【讨论】:

  • 您能否补充说明为什么这与parseInt(v * 100) / 100 不同?
  • @adiga "2.3" * 100 = 229.99999999999997 请参阅0.30000000000000004.com "2.3" * 1000 / 10 = 230
  • 仅供参考。这将失败,数量很大。例如。 tofixed('53219247129812312132.453')
  • @JavadShariati 我知道floating point。 parseInt(str * 1000 / 10) /100 解决了 parseInt(str * 100) / 100 没有解决的问题呢?虽然代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文会提高其长期价值。
  • @adiga parseInt(str * 1000 / 10) /100 === parseInt((str * 1000) / 10) /100。 @codemonkey 谢谢。 str.match(/\d+(?:\.\d{1,2})?/)[0] 是最好的结果。 ;)
猜你喜欢
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2014-01-02
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多