Javascript删除敲除绑定中的小数

Javascript删除敲除绑定中的小数,javascript,knockout.js,Javascript,Knockout.js,我已经看到,关于Javascript中的十进制精度和显示,有很多问题。问题是我找到了一个解决方案,我认为这对我来说已经足够了 关键的是,我正在尝试解析一个字符串来进行取整,然后使用这样的表达式返回数字 return parseFloat(num.toFixed(2)); 但在某些情况下,它并没有像预期的那样起作用。老实说,我不确定这是否与我使用ko的方式有关,也不确定是否与我使用的javascript代码有关。但假设在下面的fiddle中,您在上面的文本框中键入14.385,这两个字段将正确舍

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

关键的是,我正在尝试解析一个字符串来进行取整,然后使用这样的表达式返回数字

return parseFloat(num.toFixed(2));
但在某些情况下,它并没有像预期的那样起作用。老实说,我不确定这是否与我使用ko的方式有关,也不确定是否与我使用的javascript代码有关。但假设在下面的fiddle中,您在上面的文本框中键入14.385,这两个字段将正确舍入,并显示正确的小数位数,但在不删除该数字的情况下,您添加3333(即14.393333),而上面的一个将不会舍入。这只是一个例子,因为有一些奇怪的行为

你可以看到这里的小提琴

谢谢

编辑。我按照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>
它解决了这个问题(理想情况下,我们可以对照当前值进行检查,如果实际发生变化,只需通知)


Fiddle:和

如果您在read:中放置一个
警报(“read”)
,在write:中放置一个
警报(“write”)
,然后再次运行您的示例,这可能会帮助您思考这个问题

当您第一次通过“写入”写入下框时更改顶框,然后当“提交值”可观察值发生更改时,重新计算顶框,您将看到命中百分比的“读取”


下次编辑顶框时,当我们更改值时,write将再次被点击,这是有意义的,但由于
submittedValue
没有更改,然后读取的将不会再次发生,因为它所依赖的可观察对象不会改变。

您应该在问题中发布JSFIDLE代码,因为众所周知JSFIDLE会不时下降。
self.percentage.notifySubscribers(value);