更新
打印出数字时,它们实际上完全相同,都只显示两位小数。此外,在我的数据库中,这些值是十进制类型,精度为8,标度为2
我的rails应用程序中有一个模型。这个片段模型有两个字段:artist_cut和total_price。在这篇文章的编辑形式中,我有一些javascript根据artist_cut计算作品的total_price。我使用了artist_cut的只读字段来阻止用户编辑该字段。
然而,readonly字段很容易被挫败,所以我添加了一个验证,以确保该片段的total_price是我想要的值。如果没有,则会抛出错误。
验证适用于除3892和3898之间的所有artist_cuts。在这些情况下,它认为javascript产生的值和ruby产生的值不相等,这对我来说没有意义。我该如何解决这个问题?
_form.html.erb
var data = {a:1, b:2, c:3};
var {a, b, c, d} = data; // `d`: `undefined`
piece.rb
<div class="form-group">
<%= f.label :artist_cut %><br>
<%= f.text_field :artist_cut, class: "form-control", id: "artist_cut" %>
</div>
<div class="form-group">
<%= f.label :total_price %><br>
<%= f.text_field :total_price, class: "form-control", id: "total_price", readonly: true %>
</div>
<script>
$(document).on("change", "#artist_cut", function() {
var artist_cut = $("#artist_cut").val() || 0;
$("#total_price").val(Math.ceil((((artist_cut*2.19)+0.3)/(1-0.029))*100)/100);
});
</script>
由于
答案 0 :(得分:0)
也许你可以尝试四舍五入到小数点后两位?这可能会解决浮点计算中的小差异,如csander所述。
Math.round(Math.ceil((((artist_cut*2.19)+0.3)/(1-0.029))*100)/100, 2)
(((((self.artist_cut*2.19)+0.3)/(1-0.029))*100).ceil/100.0).round(2)
答案 1 :(得分:0)
正如其他人所指出的,问题是浮点比较不适合您的需求。解决方案是将artist_cut
列更改为Decimal类型(检查您使用的数据库的文档)并将代码中的浮点值替换为BigDecimal。
def total_price_validation
return if self.total_price == ((((self.artist_cut * "2.19".to_d)+"0.3".to_d)/(1 - "0.029".to_d)) * 100).ceil / 100
答案 2 :(得分:0)
要注意的一件事是你正在进行浮点比较。因为计算机只能准确地表示分母为2的幂的有理数,所以你会得到小的舍入误差。您应该检查预期值和真值之间的差值的绝对值是否非常小。