Wie kann ich meine Float-Zahl in Ruby bewahren
-
29-09-2019 - |
Frage
Also ich einige Code, um zu konvertieren Zahlen in Strings zu versuchen. Allerdings bemerkte ich, dass es in bestimmten Fällen nicht die letzten zwei Dezimalstellen bewahren. Zum Beispiel Typ I 1,01 und 1,04 für die Addition und ich zurück 2.04. Wenn ich nur 1,05 Typ bewahrt es die Anzahl und gibt es genau. Ich erhalte, was auf die Dinge gehen abgerundet werden. Ich weiß nicht, wie es zu verhindern, obwohl abgerundet ist. Soll ich nur das Senden (1,01 + 1,04) auf Selbst als nur einen Eingang?
Achtung! Ich habe nicht versucht noch so weiß nicht, ob sein unterstützt:
user_input = (1.04+1.01) #entry from user
user_input = gets.to_f
user_input.to_test_string
Was ich habe, so weit:
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
Danke für die Hilfe! Stellen Sie einen Code, damit ich versuchen kann!
Lösung
Zu allererst: nie Schwimmer für Geld verwenden - Verwendung Float oder Decimal für Accounting Anwendung Dollar-Betrag?
irb> x = 1.01 + 1.04
=> 2.05
irb> y = x % 1
=> 0.04999999999999982
irb> (y * 100).to_i
=> 4
Aber wenn es wollen VERYVERYVERY viel:
irb> (y * 100).round.to_i
=> 5
Andere Tipps
$ 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
Lesen Sie dieses: Was jeder Informatiker Should Know About Gleitkommaarithmetik
Auch, was Nakilon sagte.
Dies ist kein Problem mit Ruby, noch Ihrem Code (auch wenn Sie von .en.numwords loswerden müssen); es ist ein Problem mit der binären Gleitkomma-Darstellung.
Sie sollten eine Fixnum oder Bignum verwenden, um die Währung zu vertreten.
zB.
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