2017-02-10 1 views
-1

Im Folgenden finden Sie das kleine Segment des Code von meinem Skript:große ganze Zahlen ändern ihren Wert nach der Operation Anwendung

Die zusätzliche Logik ist gemäß dem Skalenwert

x = "11400000206633458812"  
scale = 2  
x = x.to_f/10**scale.to_i  
x = x == x.to_i ? x.to_i : x  
puts x 

beobachten jeden Datenwert verdeckte, dass die Wert ergibt sich "114000002066334592"

was unterscheidet sich von dem Anfangswert von x.

Meine Testpunkte sind zu diesem Zeitpunkt fehlgeschlagen.

x kann ein beliebiger Wert sein. Wenn ich x = 156 verwende, ist die Ausgabe korrekt, aber wenn die Länge der Ganzzahl 16 Ziffern übersteigt, tritt das Problem auf.

Die erwartete Ausgabe in obigen Fall ist 114000002066334588

Kann mir jemand helfen, warum der Wert verändert sich, und wie man es beheben?

+0

@AndreyDeineko, x ist tatsächlich eine Zeichenfolge .. Wenn ich x.to_d verwenden, es gibt mir eine Fehlermeldung: nicht definierte Methode 'to_d‘ für "11400000206633458812": String (NoMethodError) –

+1

_“ große Ganzzahlen ändern ihren Wert "_ -' x.to_f "gibt keine Ganzzahl zurück. – Stefan

Antwort

0

The expected output in above case is 114000002066334588

Überhaupt nicht.

Man kann nicht erwarten, dass Fließkommaoperationen genau sind. Das ist nur nicht der Fallbecause of processor architecture. In allen Sprachen, gibt es keine Ausnahmen, es gibt Problemumgehungen, mit Dezimalstellen genau zu arbeiten. In Ruby ist es BigDecimal:

require 'bigdecimal' 

BigDecimal("11400000206633458812")/100 
#⇒ 0.11400000206633458812E18 

(BigDecimal("11400000206633458812")/100).to_i 
#⇒ 114000002066334588