我的数据库中有一个名为“价格”的字段,它是一个小数字段,在我的 JSON API 响应中,它以字符串形式返回。
我想对字段应用一些验证,该字段在句号后最多允许 2 位数字,并发现如果我使用小数字段,我可以在数据库级别应用精度。
t.decimal "price", precision: 10, scale: 2
然后我想计算服务对象中的总价格:
class CurrentMonthRidesGenerator
def initialize(current_user)
@current_user = current_user
end
def call
user_current_month_rides_by_day.map do |date, rides_on_day|
{
day: formatted_date(date),
total_distance: total_distance(rides_on_day),
avg_ride: avg_ride(rides_on_day),
avg_price: avg_price(rides_on_day),
total_price: total_price(rides_on_day)
}
end
end
...
def total_price(rides)
rides.map(&:price).sum
end
end
Run Code Online (Sandbox Code Playgroud)
get '/current_month' do
Statistics::CurrentMonthRidesGenerator.new(current_user).call
end
Run Code Online (Sandbox Code Playgroud)
但在 API 响应中,该字段是一个字符串。
{
"day": "November, 8th",
"total_distance": "9km",
"avg_ride": "9km",
"avg_price": "100.0PLN",
"total_price": "100.0"
}
Run Code Online (Sandbox Code Playgroud)
我希望该字段在保存时返回,因为我需要在前端使用浮点/十进制数,然后进行其他计算。
为什么它是十进制字段时返回字符串?我该如何修复它?
它以字符串形式返回,因为 ruby 中的 Decimal/BigDecimal 是一个非常精确的数字。Javascript/JSON 没有像 ruby 的 BigDecimal 一样精确的数据类型。
如果您在序列化程序中将该值转换为浮点型,那么它将是 API 返回的 JSON 对象中的浮点型,但您需要注意客户端如何使用此数据。如果他们不使用可以处理精度的库,那么您将出现舍入错误,并且计算结果通常会偏差一分钱。
我一直在使用decimal.js 库来完成类似的事情,效果非常好。https://github.com/MikeMcl/decimal.js/