【问题标题】:parseFloat ignores characters after decimal pointparseFloat 忽略小数点后的字符
【发布时间】:2021-07-20 23:11:00
【问题描述】:

我希望我的函数将字符串或数字格式化为小数点后 X 位的十进制数。我的问题是,当我将3.0004 传递给我的函数时,我得到3。我已阅读文档,似乎每当parseFloat 找到. 时,例如

它返回直到该字符的值,忽略无效 字符和后面的字符。

我知道它是这样做的,但是我该如何返回 3.00 呢?我希望我的函数总是返回一个小数点后带有数字的数字。我使用 parseFloat 的原因是因为我希望它返回一个数字或 null。

这是我的实现

const toDecimal = (number: number | string, digits: number = 2): number | null => {
  switch (typeof number) {
    case 'number':
      return parseFloat(number.toFixed(digits));
    case 'string':
      const parsedDecimal = parseFloat(number);
      return isNaN(parsedDecimal)
        ? null
        : parseFloat(parsedDecimal.toFixed(digits));
    default:
      return null;
  }
}


toDecimal(3.0004)  // will return 3

【问题讨论】:

  • 数值隐含33.03.00等等。尾随零是隐含的并且无限地继续。它们是否显示完全取决于数字到字符串的转换。它们只会在值以字符串形式呈现时出现,并且只有在转换添加它们时才会出现。

标签: javascript typescript


【解决方案1】:
  1. @Ouroborus 对您的问题的评论是了解正在发生的事情的关键:“数值隐含 3 和 3.0 和 3.00 等等。尾随零是隐含的并无限继续”
  2. 当你将"3.004"作为唯一参数传递时,那么digits默认为2,然后由于toFixed而固定为"3.00"

如果您希望将"3.004" 正确转换为3.004,只需以更高的精度调用您的函数:

toDecimal("3.004", 3)

【讨论】:

  • 我确实注意到传递 3 位数字是可行的,但是我编写了这个函数来在页面上显示价格,因此小数点后的 3 位数字不太适合。你认为我应该返回一个没有最终parseFloat?
  • 您返回的数据类型取决于您(或您的要求)。如果你需要显示货币,那么你必须建立一个四舍五入的政策。例如,如果最终值为"3.004",您必须决定是向上舍入到3.01 还是向下舍入到3.00
  • 我同意,但是返回一个字符串而不是一个数字是一个好的决定吗?
【解决方案2】:

添加如下函数:

const toDecimalFixed = (number: number | string, digits: number = 2) => {
  const parsed = toDecimal(number, digits)
  return parsed == null ? null : parsed.toFixed(2)
}

console.log(toDecimalFixed(3.0004))  // will return "3.00"

【讨论】:

  • toFixed 返回一个字符串,而不是一个数字。我可以跳过最后的parseFloat 来获得相同的结果。
  • @LazioTibijczyk 在这种情况下这个答案是正确的stackoverflow.com/a/68468361/16493446
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多