javascript - 将 86.678、1.12517、0.61457 等字符串转换为数字并递增/递减最后 3 位数字

标签 javascript jquery

我正在尝试找出一种方法,将 86.678、1.12517、0.61457 等字符串转换为数字,而不会丢失任何小数点信息和数字数量。

数字在本质上是不同的,但我需要一种方法来弄清楚如何将每个此类数字的最后 2 位数字递增/递减 30,例如,如果我想递增 86.678,它将变为 86.708 我无法计算这是因为每次在 . 之后都有不同数量的数字,但总是至少有 3 个,也会有像 89.990 这样的情况,数字需要增长,所以 90.020 将是​​新的,相同适用于递减。

最佳答案

这非常困惑和丑陋,但对于格式良好的数据,它应该可以工作。

function incrementalize(value) {
  return parseFloat(value) +
    parseFloat(value.replace(/\d/g, 0).replace(/00$/, '30'));
}

这里的第一个正则表达式将所有内容清零,所以 123.4567 变成了 000.0000,然后尾随的零对被换掉,所以你得到 000.0030。这是添加到您的原始值。

请注意,在将数字与小数值相加时,会显示出 IEEE-754 double 字固有的不精确性。例如,您的 0.61457 + 0.00030 示例。

实例:

test(86.678);
test(1.12517);
test(0.61457);
test(0.0123);
test(0.9999);

function incrementalize(value) {
  return parseFloat(value) +
    parseFloat(value.replace(/\d/g, 0).replace(/00$/, '30'));
}

function test(num) {
  var newNum = incrementalize(String(num));
  snippet.log(num + " => " + newNum);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

更新:为了保持初始值的精度,使用 sprintf-js 库:

function incrementalize(value) {
  return sprintf(
    '%.' + value.split(/\./)[1].length + 'f', 
    parseFloat(value) +
      parseFloat(value.replace(/\d/g, 0).replace(/00$/, '30'))
  );
}

关于javascript - 将 86.678、1.12517、0.61457 等字符串转换为数字并递增/递减最后 3 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591892/

相关文章:

javascript - Angularjs 网站没有在谷歌上建立索引

jquery - 如何在 jQuery 中使元素可拖动?

javascript - 当单元格进入编辑模式时,禁止单击除一个单元格(所选行中)之外的任何位置

javascript - For 循环迭代 < vs <= JavaScript 基础

javascript - 动态切换 CSS 文件

javascript - 如何告诉 webpack 额外的依赖?

jquery - 动态添加的 jQuery 元素的样式

javascript - 使用ajax进行异步评论

javascript - 鼠标悬停事件处理程序不工作

javascript - 使用 JavaScript 索引变量访问 ViewBag 数组项