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!

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top