我已经看到有很多关于小数精度的问题并在Javascript中显示。问题是我找到了一个解决方案,我认为这对我来说已经足够了
关键是我正在尝试解析字符串以使用这样的表达式进行舍入然后返回数字。
return parseFloat(num.toFixed(2));
但是有些情况下它不能按预期工作。说实话,我不确定它是否与我使用ko或javascript代码进行解析的方式有关。但是,让我们说在下面的小提琴你在上面的文本框中键入14.385,两个字段都将正确舍入并显示正确的小数位数,但不删除你添加的数字3333(即14.393333),上面的一个赢了不圆润。这只是一个例子,因为有一些奇怪的行为。
哟可以看到这里的小提琴http://jsfiddle.net/RTexF/
由于
编辑。我根据judja指示添加代码(当你链接小提琴时,我不明白要求代码的原因,我现在看到了这一点)
脚本
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>
编辑:
知道它是旧的,但我想注意将其添加到write方法
self.percentage.notifySubscribers(value);
它修复了这个问题(理想情况下我们可以检查当前值,只是在实际发生变化时才会检查)
小提琴:http://jsfiddle.net/RTexF/1/和http://jsfiddle.net/RTexF/2/
答案 0 :(得分:0)
如果您在中读取了alert("read")
并在中写了alert("write")
:,这可能有助于您考虑这一点然后再次运行你的例子。
当您第一次通过写入写入底部框时更改顶部框,然后重新计算顶部框,因为submittedValue
observable已更改并且您'对于被击中的百分比,请看读取。
下次修改顶部框时,当我们更改值时,写入会再次被点击,这是有道理的,但由于submittedValue
未更改,因此读取不会再发生,因为它所依赖的可观察性不会发生变化。