Javascript和Rails编号验证

时间:2016-08-18 01:58:29

标签: javascript ruby-on-rails ruby

更新

打印出数字时,它们实际上完全相同,都只显示两位小数。此外,在我的数据库中,这些值是十进制类型,精度为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>

由于

3 个答案:

答案 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的幂的有理数,所以你会得到小的舍入误差。您应该检查预期值和真值之间的差值的绝对值是否非常小。