如何在ruby中保留我的浮点数

时间:2010-11-07 21:57:41

标签: ruby rounding currency linguistics

所以我正在尝试使用一些代码将数字转换为字符串。但是,我注意到在某些情况下它不会保留最后两位小数。例如,我输入1.01和1.04添加,然后我回到2.04。如果我只输入1.05,它会保留数字并完全返回。我知道事情正在进行中。我不知道如何防止它被舍入。我应该只考虑将(1.01 + 1.04)发送给自己作为一个输入吗?

警告!我还没试过这个,所以不知道它是否支持:

 user_input = (1.04+1.01) #entry from user
 user_input = gets.to_f
 user_input.to_test_string

到目前为止我所拥有的:

    class Float
     def to_test_string

      cents = self % 1
      dollars = self - cents
      cents = cents * 100

      text = "#{dollars.to_i.en.numwords} dollars and #{cents.to_i.en.numwords} cents"

      puts text
      text
     end
    end
  puts "Enter two great floating point numbers for adding"
  puts "First number"
  c = gets.to_f
  puts "Second number"
  d = gets.to_f
  e = c+d
  puts e.to_test_string
  puts "Enter a great floating number! Example 10.34"
  a = gets.to_f 
  puts a.to_test_string

感谢您的帮助!发布一些代码,以便我可以尝试!

3 个答案:

答案 0 :(得分:2)

首先:永远不要使用浮动钱 - Use Float or Decimal for Accounting Application Dollar Amount?

irb> x = 1.01 + 1.04
=> 2.05
irb> y = x % 1
=> 0.04999999999999982
irb> (y * 100).to_i
=> 4

但是,如果想要它很多:

irb> (y * 100).round.to_i
=> 5

答案 1 :(得分:2)

$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.04+1.01
2.0499999999999998

阅读本文:What Every Computer Scientist Should Know About Floating-Point Arithmetic

此外,Nakilon说道。

答案 2 :(得分:1)

这不是ruby的问题,也不是你的代码(虽然你需要摆脱.en.numwords);它是a problem,带有二进制浮点表示。

您应该使用Fixnum或Bignum来代表货币。

例如

class Currency
    def initialize str
        unless str =~ /([0-9]+)\.([0-9]{2})/
            raise 'invalid currency string'
        end
        @cents = $1.to_i * 100 + $2.to_i
    end
end