JavaScript:Trim.toPrecision()尾随零
我正在使用JavaScript创建一个在线计算器 我要计算一下:JavaScript:Trim.toPrecision()尾随零,javascript,math,precision,Javascript,Math,Precision,我正在使用JavaScript创建一个在线计算器 我要计算一下: eval(expression).toPrecision(10); 这在几乎所有情况下都能产生正确的输出。例如 eval('456456+45646486*45646884').toPrecision(10) // Output: "2.083619852e+15" eval('1/0').toPrecision(10) // Output: "Infinity" 然而 eval('4*1').toPrecision(10)
eval(expression).toPrecision(10);
这在几乎所有情况下都能产生正确的输出。例如
eval('456456+45646486*45646884').toPrecision(10)
// Output: "2.083619852e+15"
eval('1/0').toPrecision(10)
// Output: "Infinity"
然而
eval('4*1').toPrecision(10)
// Output: "4.000000000"
如何修剪尾随的零,但同时保持上述良好的输出?仅限所有零位小数
eval('4*1').toPrecision(10).replace(/\.0+$/,"")
零结束小数:
eval('4.5*1').toPrecision(10).replace(/\.([^0]+)0+$/,".$1")
eval('4.5*0').toPrecision(10).replace(/\.?0+$/,"")
编辑:处理所有零和结束零的情况
编辑:如果始终首先使用.toPrecision(),因此始终使用“.”,则可以删除任何尾随的零:
eval('4.5*1').toPrecision(10).replace(/0+$/,"")
编辑:处理尾随小数:
eval('4.5*1').toPrecision(10).replace(/\.([^0]+)0+$/,".$1")
eval('4.5*0').toPrecision(10).replace(/\.?0+$/,"")
以下
replace()
调用将替换所有尾随0
s和尾随
,如果存在:
eval(expression).toPrecision(10).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1")
它是如何工作的?
/(?:\.0+)(\.\d+?)0+$/
在字符串()的末尾查找\.0+
或(\.\d+?)0+
。?:
阻止\.0+|(\.\d+?)0+
被删除
\.0+
将匹配
,后跟任意数量的0
s
(\。\d+?)0+
将匹配
,后跟至少一个数字,后跟至少一个0
。确保0+
匹配尽可能多的0
s。括号中“捕获”了非0
s
replace()
上的第二个参数是替换匹配内容的新字符串。$1
是一个排序变量,它告诉replace()
用第一个捕获的值替换匹配的值(因为1
在$
之后)。在本例中,第一个捕获的值是匹配的\.\d+?
值
因此,最后:
后跟任意数量的0
s将被丢弃
后跟非0
s,后跟0
s将丢弃0
s1
、2
和3
的40*1
、4*1
和40*1
精度的比较方法,请参见下文。每组中的第一个(粗体)项是此方法。红色项目是那些不符合预期的项目
var测试=[
'.04*1',
'.40*1',
'4*1',
'40*1'
];
var结果={};
对于(变量i=0;i”;
}
}
body{font-family:monospace;}
.应为{字体大小:粗体;}
.无效{颜色:红色;}
使用toPrecision后除以1。
Javascript将跟踪零,并且不需要正则表达式。
numb=(Math.round(numb*100000000))/100000000)代码>谢谢大家,但这两个建议仅涉及第二个和第三个示例,但现在第一个示例生成的是“2083619852000000”,而不是“2.083619852e+15”。请确保表达式是由您生成的,而不是由第三方生成的。也就是说,读取输入并在此基础上生成表达式
,因为.small,但eval('4+0.0001')。toPrecision(10)。replace(/\.0+$/,“”)
给出了“4.000100000”而不是“4.0001”的答案,为此添加了两个其他选项。如果需要更复杂的东西,请告诉我。Regex来救援吗?我想最后一次编辑成功了!我会给它一个更彻底的测试,如果它好去接受!非常感谢。对于整数,是否有稍微改进的方法?i、 e.“2”而不是“2”。@greg:答案中增加了。我认为最后一个是一个,有一个很好的感觉…简单地使用$2而不是$1将比不捕获组简化和运行更快。@dandavis“Simplfy”是主观的。在处理复杂的正则表达式时,我发现,从长远来看,只捕获实际要使用的组可以大大简化工作。这不是我所拥有的。是的,使用Chrome37可以更快地使用捕获组,但无论使用何种方法,Firefox33的性能似乎都一样好。而且,有几次我进行了测试,Firefox在非捕获组的情况下表现更好。我使用了这样的解决方案:val.toFixed(2)/1
这是有效的,因为在javascript中,字符串和数字之间的除法返回一种数字类型,如果用1乘法,同样适用。我认为这是大多数人的答案(不是OP)你可能在找我。例如:eval(<456456486+45646486*45646884')。toPrecision(10)
=2.083619852e+15
就像op想要的那样,但将其转换为一个数字(/1
)会产生主观上更丑陋的2083619852000000
,这实际上相当有效。