Ruby 转换货币需要适当的回合(2)
这是我将当地货币转换为欧元的代码Ruby 转换货币需要适当的回合(2),ruby,Ruby,这是我将当地货币转换为欧元的代码 price_eur = price.to_i / 3.4528 price_eur = price_eur.round(2) 问题是,如果price=0.8,我会得到结果price\u eur=0.0,为什么 如何使其0.80(正确的值且始终前导零) 因为0.8.to_i是0 这是不可能的 to_i向下舍入到最接近的整数-so0.8。to_i为零。然后零对其他任何东西都保持零 不能使用整数-请使用浮点价格。到f 然后,使用sprintf('.2f',price
price_eur = price.to_i / 3.4528
price_eur = price_eur.round(2)
问题是,如果price=0.8
,我会得到结果price\u eur=0.0
,为什么
如何使其0.80
(正确的值且始终前导零)
0.8.to_i
是0
to_i
向下舍入到最接近的整数-so0.8。to_i
为零。然后零对其他任何东西都保持零
不能使用整数-请使用浮点<代码>价格。到f
然后,使用sprintf('.2f',price_eur)
将其打印为字符串,前导为零
pry 2.1.2 (main):0 > price = 0.8
0.8
=>
pry 2.1.2 (main):0 > price_eur = price.to_f / 3.4528
0.23169601482854496
=>
pry 2.1.2 (main):0 > price_eur = price_eur.round(2)
0.23
=>
pry 2.1.2 (main):0 > sprintf('%.2f', price_eur)
"0.23"
=>
pry 2.1.2 (main):0 >
编辑:注意@Stefan的注释不使用浮点数,而是使用BigDecimal。事实上,处理金钱最简单的方法可能是使用money gem,它已经处理了很多这样的问题:而不是
price.to\i
doprice.to\f
。这是一个尾随零,不会产生0.80
这样的东西。它只是那样印了一条线。萨瓦:是的。。。不能将其存储为尾随零的浮点。当您想将它呈现给用户时,您可以通过将它呈现为前导和尾随为零的字符串来处理它。这就是OP想要做的事情。苏里亚-很抱歉你觉得我的解释不好。我说它四舍五入到最接近的整数。我不知道如何使它更清楚?你永远不应该使用(或建议)浮动来进行货币计算,而应该使用它。@Stefan除非你正在计算税收、汇率、利息等,但请尝试“0.8”。to_I.round(2)
“0.8”。to_I.round(2)给我0.0。“0.8”。to_I
返回0
和0.round(2)
返回0.0