删除敲除绑定中的小数的Javascript

Javascript removing decimals in knockout binding

本文关键字:小数 Javascript 绑定 删除      更新时间:2023-09-26

我看到关于Javascript中的小数精度和显示有很多问题。问题是,我找到了一个解决方案,我认为这对我来说已经足够了

关键是,我正试图解析成一个字符串进行舍入,然后使用这样的表达式返回到数字。

return parseFloat(num.toFixed(2));

但在某些情况下,它并没有像预期的那样发挥作用。老实说,我不确定这是与我使用ko的方式有关,还是与我设置的用于解析的javascript代码有关。但我们假设,在下面的fiddle中,您在上部文本框中键入14.385,两个字段都将被正确取整,并显示正确的小数位数,但在不删除数字的情况下,您添加3333(即14.393333),上部的一个不会被取整。这只是一个例子,因为有一些奇怪的行为。

Yo可以在这里看到小提琴http://jsfiddle.net/RTexF/

感谢

编辑。我根据judgeja的指示添加代码(当你链接fiddle时,我不明白要求代码的原因,我现在明白了)

脚本

var decimalValue = 0.25;
function ViewModel() {
    var self = this;
    self.submittedValue = ko.observable(decimalValue);
    self.percentage = ko.computed({
        read: function() {
            alert('read');
            if (isNaN(parseFloat(self.submittedValue())))
                return '';
            var num = self.submittedValue() * 100;
            return parseFloat(num.toFixed(2));
        },
        write: function(value) {
            alert('write');
            value = isNaN(value) ? '' : parseFloat((value / 100).toFixed(4));
            self.submittedValue(value);
        },
        owner: self
    });
}
ko.applyBindings(new ViewModel());

和html

<p><input data-bind="value:percentage"></input></p>
<p><input data-bind="value:submittedValue"></input></p>

编辑:

知道这是一个旧的,但我想注意的是,将其添加到写方法中

self.percentage.notifySubscribers(value);

它解决了这个问题(理想情况下,我们可以对照当前值进行检查,如果它真的发生了变化,就通知它)

Fiddle:http://jsfiddle.net/RTexF/1/和http://jsfiddle.net/RTexF/2/

如果您在read:中放入一个alert("read"),在write:中放入alert("write"),然后再次运行您的示例,这可能会帮助您思考这个问题。

当您第一次通过写入写入底部框时更改顶部框,然后随着submittedValue可观测值的更改重新计算顶部框,您将看到读取命中百分比。

下一次编辑顶部框时,由于我们正在更改值,写入将再次被点击,这是有道理的,但由于submittedValue没有更改,因此读取不会再次发生,因为它所依赖的可观察对象不会更改。