0

私の人生では、 my:メソッドが「インポートされたディナープレートアイテム」に等しいはずのときになぜgenerate_receipt返されるのか理解できません。配列が実際に正しい値を返すことを確認するために、RSpec テストを作成しました。54.954.65

47.50 + 4.75 + 2.40 = 54.65

なぜ54.9代わりに戻ってくるの54.65ですか?この切り上げはどこで発生していますか? 正しい値を返すにはどうすればよいですか? 私は困惑しています。

describe :calcualte_sales_tax do

  it "should return the correct array" do
    calculate_sales_tax(@receipt).should eq([0, 4.75])
  end

end

describe :calculate_import_tax do

  it "should return the correct array" do
    calculate_import_tax(@receipt).should eq([0.50, 2.40])
  end

end 

@receipt = {
    "1"=>{:item=>"imported chocolates", :price=>10.00, :quantity=>1},    
    "2"=>{:item=>"imported dinner plates", :price=>47.50, :quantity=>1}
    }

def generate_receipt(receipt)
  n = 0
  while n < receipt.length 
    receipt["#{n+1}"][:price]+=calculate_sales_tax(receipt)[n]
    receipt["#{n+1}"][:price]+=calculate_import_tax(receipt)[n]
    n+=1
  end
  receipt
end

def calculate_import_tax(receipt)
  taxes = []
  receipt.each do |k,v|
    if (v[:item] =~ /imported/)
      subtotal = v[:price]
      # v[:price]+=(((((5 * subtotal)/100)*20.ceil) / 20.0))
      # taxes<<(5 * subtotal)/100
      taxes<<((5 * subtotal/100)*20).ceil/20.0.round(2)
    else
      taxes<<0
    end
  end
  taxes
end

def calculate_sales_tax(receipt)
  tax_free_items = ["book", "chocolate bar", "chocolates", "pills"]
  taxes = []
  receipt.each do |k,v|
    if (v[:item] =~ /chocolate\s/) ||
      (v[:item] =~ /chocolates/) || 
      (v[:item] =~ /book/) || 
      (v[:item] =~ /pills/)
      taxes<<0
    else
      subtotal = v[:price]
      # v[:price]+=(((((10 * subtotal)/100)*20.ceil) / 20.0))
      # taxes<<(10 * subtotal)/100
      taxes<<((10 * subtotal/100)*20).ceil/20.0
    end
  end
  taxes
end
4

2 に答える 2

1
def generate_receipt(receipt)
  n = 0
  while n < receipt.length
    puts receipt["#{n+1}"][:price].inspect
    receipt["#{n+1}"][:price]+=calculate_sales_tax(receipt)[n].round(2)
    puts receipt["#{n+1}"][:price].inspect
    puts calculate_import_tax(receipt)[n]
    receipt["#{n+1}"][:price]+=calculate_import_tax(receipt)[n].round(2)
    puts receipt["#{n+1}"][:price].inspect
    puts "-----"
    n+=1
  end
  receipt
end

戻り値:

47.5
52.25
2.65
54.9

バグはcalculate_import_taxメソッドにあります。2.40ではなく2.65を返します。

編集:

とった :)。

    receipt["#{n+1}"][:price]+=calculate_sales_tax(receipt)[n]
    receipt["#{n+1}"][:price]+=calculate_import_tax(receipt)[n]

これらの行は、領収書の価格を更新しています。したがって、テストは独立して実行されますが、消費税は、輸入税が計算される前に未加工の価格を変更しています...

于 2013-01-31T21:35:14.973 に答える
0

1) Ruby は小数部分のない数値を INTEGERS として扱います。また、計算に浮動小数点数が含まれていない限り、小数部分を含む結果は作成されません。

2) 10 * X / 100 * 20 == X * 2

3) LEGAL COUNTING には特定の精度が必要な場合があるため、そのような数値計算には専用のライブラリを使用する必要がある場合があります。

迅速な解決策は、そのコードを次のように変更することです。

10.0 * 小計 / 100.0 * 20.0

これで、Ruby はこれらすべての数値を float として扱います。

于 2013-01-31T21:38:40.160 に答える