所以我正在尝试使用一些代码将数字转换为字符串。但是,我注意到在某些情况下它不会保留最后两位小数。例如,我输入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
感谢您的帮助!发布一些代码,以便我可以尝试!
答案 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