如何存储重量/体积的数值而又不出现浮点舍入误差并在单位之间转换(g> kg)?

我需要在一个名为PackageType的Rails模型中存储一个体积和一个重量。我有两个(链接的)问题:

  1. 值不能是整数。例如,可能是0.5kg。但是我想避免与float关联的舍入错误:加/乘/除后,我不想冒险得到1.00000001kg(主要是出于会计原因)。
  2. 我很想将它们存储为一个小单位,它们始终是整数:g和cm3。 (我知道我的包裹不会小于1g / 1cm3)。但这并不是非常用户友好:我的用户需要查看并输入以L(dm3)和kg为单位的值。

我现在发现的解决方案是使用weight_g和volume_cl列:

rails g migration AddVolumeAndWeigthToPackageTypes volume_cm3:integer weight_g:integer

在我的模型中有一些在单位之间转换的方法:

class PackageType < ApplicationRecord
  …
  def volume_dm3
    volume_cm3.to_f / 1000
  end

  def volume_dm3=(vol)
    self.volume_cm3 = (vol*1000).to_i
  end

  def weight_kg
    weight_g.to_f / 1000
  end

  def weight_kg=(w)
    self.weight_g = (w*1000).to_i
  end
end

这有效,但感觉不正确,并提出了一些问题:

  1. 为什么在Rails模型中我可以不使用@表示法访问Model属性?就像我可以仅通过调用volume_cm3而不是self.volume_cm3或@ volume_cm3来读取存储的内容。为什么我可以在不把自我摆在最前面的情况下阅读,但是我需要精确的self.volume_cm3来编写它?
  2. 这是正确的方法吗?还是我应该放弃此转换并将kg和L直接存储为小数?我真的不希望现在以任何其他单位显示用户,kg和L是我将要使用的唯一单位。我很想只使用小数,kg和L。
  3. 当您需要存储具有单位的内容时,建议使用什么方式命名数据库列和模型属性?是“ volume”(假定单位),“ volume_dm3”,“ volume_in_dm3”吗?
yangshegnhui 回答:如何存储重量/体积的数值而又不出现浮点舍入误差并在单位之间转换(g> kg)?

  1. @表示法是创建实例变量,以便可以在视图中访问控制器中的变量。因此@表示法实际上与访问模型本身内的变量没有任何关系。据我所知,在写入变量时需要指定self.volume_cm3并仅使用volume_cm3即可访问它的原因是,在写入时,Rails需要知道您没有在创建变量与属性名称相同的局部变量(我不推荐这样做,但我不认为ruby会阻止您这样做)。因此self.volume_cm3 = 3将设置属性volume_cm3,但是volume_cm3 = 3只会创建一个值为3的局部变量。

  2. 如果要将数据存储为小数,则始终可以使用'%.Nf' % volume_cm3舍入小数,其中N是要将小数舍入的位数。因此'%.2f' % 1.345将舍入到两位小数,然后为您提供1.35

  3. 在数字和单位方面,我不认为ruby有具体的命名指南,因此这可能只是一个偏好问题。如果要使用其他单位来测量体积,则将特定单位添加到属性名称的末尾可能会有所帮助,以避免混淆(例如volume_cm3volume_L等)。如果您仅按每个属性以一个单位进行度量,则只需将它们命名为volumeweight,然后在模型中添加一些注释,说明它们必须以特定单位为单位。

本文链接:https://www.f2er.com/3164596.html

大家都在问