Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript和Rails编号验证_Javascript_Ruby On Rails_Ruby - Fatal编程技术网

Javascript和Rails编号验证

Javascript和Rails编号验证,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,更新: 打印数字时,它们实际上是完全相同的,并且都只显示两位小数。此外,在我的数据库中,这些值是精度为8、刻度为2的十进制类型 我的rails应用程序中有一个碎片模型。该模型有两个字段:艺术家的切割和总价。在这件作品的编辑形式中,我有一些javascript,它根据艺术家的裁剪计算出这件作品的总价格。我为Artister_cut使用了一个只读字段,以防止用户编辑该字段 然而,只读字段很容易被屏蔽,因此我添加了一个验证,以确保该作品的总价格是我想要的价值。如果不是,则抛出一个错误 验证适用于除38

更新:

打印数字时,它们实际上是完全相同的,并且都只显示两位小数。此外,在我的数据库中,这些值是精度为8、刻度为2的十进制类型

我的rails应用程序中有一个碎片模型。该模型有两个字段:艺术家的切割和总价。在这件作品的编辑形式中,我有一些javascript,它根据艺术家的裁剪计算出这件作品的总价格。我为Artister_cut使用了一个只读字段,以防止用户编辑该字段

然而,只读字段很容易被屏蔽,因此我添加了一个验证,以确保该作品的总价格是我想要的价值。如果不是,则抛出一个错误

验证适用于除3892和3898之间的艺术家_剪切之外的所有艺术家_剪切。在这些情况下,它认为javascript产生的值和ruby产生的值不相等,这对我来说没有意义。我怎样才能解决这个问题

_form.html.erb

<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>

谢谢

也许你可以试着把两位小数点后两位四舍五入?正如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)

也许你可以试着把两位小数点后两位四舍五入?正如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)

正如其他人所指出的,问题在于浮点比较不适合您的需要。解决方案是将
artist\u cut
列更改为十进制类型(检查文档中使用的数据库),并将代码中的浮点值替换为


正如其他人所指出的,问题在于浮点比较不适合您的需要。解决方案是将
artist\u cut
列更改为十进制类型(检查文档中使用的数据库),并将代码中的浮点值替换为



需要注意的一点是,您正在进行浮点比较。因为计算机只能精确地表示分母为2的幂的有理数,所以会有很小的舍入误差。您应该检查预期值和真实值之间的差值的绝对值是否非常小。

需要注意的一点是,您正在进行浮点比较。因为计算机只能精确地表示分母为2的幂的有理数,所以会有很小的舍入误差。您应该检查预期值和真实值之间的差值的绝对值是否非常小。

需要注意的一点是,您正在进行浮点比较。因为计算机只能精确地表示分母为2的幂的有理数,所以会有很小的舍入误差。您应该检查预期值和真实值之间的差值的绝对值是否正确。@csander如何检查这个绝对值差值?@csander等等,我明白您的意思。在验证过程中,我检查了总价减去公式值之差的绝对值是否小于或等于0.0000000001。这工作做得很好。如果您将此作为答案,我可以将其标记为正确:)我将响应作为答案发布。需要注意的一点是,您正在进行浮点比较。因为计算机只能精确地表示分母为2的幂的有理数,所以会有很小的舍入误差。您应该检查预期值和真实值之间的差值的绝对值是否正确。@csander如何检查这个绝对值差值?@csander等等,我明白您的意思。在验证过程中,我检查了总价减去公式值之差的绝对值是否小于或等于0.0000000001。这工作做得很好。如果你把这个作为答案,我可以把它标记为正确:)我把这个回复作为答案贴了出来。艺术家的剪贴总是十进制的。我尝试了您指定的to_d方法,但得到了相同的错误。有什么建议吗?事实上,即使在其他情况下它也不起作用。艺术家的切割总是十进制的。我尝试了您指定的to_d方法,但得到了相同的错误。有什么建议吗?事实上,即使在其他情况下,它也不起作用。我这样做了,但它不起作用。.ceil方法不是用来舍入它们吗?而且,这似乎使javascript舍入到最接近的整数。我这样做了,但它不起作用。.ceil方法不是用来取整它们吗?而且,这似乎使javascript取整到最接近的整数。这方面的代码实现是
return if(self.total_price-(((self.artist_cut*2.19)+0.3)/(1-0.029))*100.ceil/100.0)。abs这方面的代码实现是
return if(self.total_price-((((自我艺术家切*2.19)+0.3)/(1-0.029))*100.ceil/100.0).abs
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