Ruby把.50读作.5
我有一个Ruby把.50读作.5,ruby,Ruby,我有一个项类,我初始化了五个变量。我正在尝试将终端中的输出与预期\u摘要的值相匹配。我正在调用Item.summary,代码如下: class Item attr_reader :name, :description, :manufacturer, :price, :summary def initialize (name, manufacturer, price, description=nil, summary=nil) @name = name @manufact
项
类,我初始化了五个变量。我正在尝试将终端中的输出与预期\u摘要的值相匹配。我正在调用Item.summary
,代码如下:
class Item
attr_reader :name, :description, :manufacturer, :price, :summary
def initialize (name, manufacturer, price, description=nil, summary=nil)
@name = name
@manufacturer = manufacturer
@price = price
@description = description
if description
@summary = "Name: #{name}
Description: #{description}
Manufacturer: #{manufacturer}
Price: $#{price}"
else
@summary = "Name: #{name}
Manufacturer: #{manufacturer}
Price: $#{price}"
end
end
end
#expected_summary = %q(Name: Spy Notebook
#Manufacturer: Spys-R-Us
#Price: $10.50)
item = Item.new("Spy Notebook", "Spys-R-Us", 10.50)
puts item.summary
当我将数字10.50
作为price
参数传递时,它返回为10.5
。我不明白为什么。为什么Ruby将10.50
读为10.5
?是否有办法更正此问题?也许您可以定义自定义方法,将数字格式化为两位小数的字符串:
def two_decimals(number)
number = Float(number)
price_split = number.to_s.split('.')
price_split[1] = price_split.last + '0'*(2-price_split.last.size) if price_split.last.size < 2
price_split.join('.')
end
two_decimals(10.25) #=> "10.25"
two_decimals(10.2) #=> "10.20"
two_decimals(10) #=> "10.00"
def两位小数(数字)
数字=浮动(数字)
价格分割=编号到分割('.'))
price_split[1]=price_split.last+'0'*(2-price_split.last.size)如果price_split.last.size<2
price_split.join('.'))
终止
两位小数(10.25)#=>“10.25”
两位小数(10.2)#=>“10.20”
两位小数(10)#=>“10.00”
或者更好的…答案在中,它允许您将浮点强制转换为一个小数点后两位的字符串。这种方法也适用于三位数的四舍五入,我没有进一步尝试,但我相当肯定它会起作用。下面是修改后的原始代码,以准确展示其工作原理
class Item
attr_reader :name, :description, :manufacturer, :price, :summary
def initialize (name, manufacturer, price, description=nil, summary=nil)
@name = name
@manufacturer = manufacturer
@price = "%.2f" % price
@description = description
if description
@summary = "Name: #{name}
Description: #{description}
Manufacturer: #{manufacturer}
Price: $#{@price}"
else
@summary = "Name: #{name}
Manufacturer: #{manufacturer}
Price: $#{@price}"
end
end
def price
@price
end
end
编辑:我没有看到@tadman的评论,直到发布这篇文章后,他才找到答案 格式化数字的常用方法是:
'%.02f' % number
其中,这是描述您希望如何格式化内容的符号。这是从C语言继承而来的,并在许多其他语言中出现:
'%f' % number # A floating-point number with default precision
'%.02f' % number # A floating-point number rounded to 2 places
在Rails中,您还可以使用帮助器方法,例如,它可以处理十进制分隔符不是点的本地化情况:
number_with_precision(number, precision: 2, locale: :fr)
# => 1,50
这已经得到了回答,呃,10.50和10.5是一样的?10.50和10.5之间有什么区别?没错,没有区别!它只是用两种方式写的相同的值。我看到了,但我正试图精确匹配预期的值。所以我希望我的输出是10.50,而不是10.5。浮点数经常会有一点点不匹配,这就是为什么测试框架通常有一个assert\u approx\u equal
type方法来处理细微的差异。计算的结果可能是10.4999999939361
,但实际上是10.50
四舍五入到两位。.round(2)
对您的案例来说,工作做得足够好吗?内部没有10.50
,而是存储的更像1.05000000…*10^1
通常使用!如果你想发布你的答案,我将删除我的。谢谢大家!!我了解到“%.2f”%#数字非常有效。不仅如此,对我来说,这是一个伟大的编程“哈哈”时刻。再次感谢!