Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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
Ruby把.50读作.5_Ruby - Fatal编程技术网

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”%#数字非常有效。不仅如此,对我来说,这是一个伟大的编程“哈哈”时刻。再次感谢!