我正在试图找出一种方法,将86.678,1.12517,0.61457等字符串转换为数字,而不会丢失任何小数点信息和数字。
数字本质上是不同的,但我需要一种方法来弄清楚如何将每个这样的数字的最后2位递增/递减30,例如,如果我想增加86.678,它将变为86.708我无法计算因为每次在句号.
之后有不同的数字但是总是至少有3,所以也会出现像89.990这样的情况,其中数字需要增长,所以90.020将是新的,同样适用于减量
答案 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;
更新:要使用sprintf-js库保持初始值的精度:
function incrementalize(value) {
return sprintf(
'%.' + value.split(/\./)[1].length + 'f',
parseFloat(value) +
parseFloat(value.replace(/\d/g, 0).replace(/00$/, '30'))
);
}