JavaScript:Trim.toPrecision()尾随零

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)

我正在使用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)
// 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
    s
  • 例子 有关
    1
    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
    ,这实际上相当有效。