将字符串(如86.678,1.12517,0.61457)转换为数字并递增/递减最后3位

时间:2015-09-15 17:12:23

标签: javascript jquery

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

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

1 个答案:

答案 0 :(得分:4)

这非常混乱和丑陋,但对于格式良好的数据,它应该有效。

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

此处的第一个正则表达式将所有内容清零,因此123.4567变为000.0000,然后将结尾的零对切换出来,因此您获得000.0030。这已添加到原始值。

请注意,在添加带小数值的数字时,可能会出现IEEE-754双精度数字的固有不精确度。例如,它使用您的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>
&#13;
&#13;
&#13;

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

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