Ich lese Daten im Format DECIMAL
aus einer MySQL-Tabelle. Ich möchte innerhalb R. Berechnungen auf diese Zahlen tunGibt es in R einen Datentyp "Dezimal"?
habe ich sie zu einem numeri represaentation werfen as.numeric()
verwenden, aber die Dokumentation sagt:
numerisch identisch ist zu verdoppeln (und real).
Aber gibt es auch einen Datentyp Dezimal in R? (Datentyp ohne Rundungsfehler, ...)
Hier ist ein einfaches Beispiel für das Problem mit Rundungsfehler:
numbersStrings = c("0.1", "0.9")
numbersNumeric = as.numeric(numbersStrings)
numbersMirror = c(numbersNumeric, 1-numbersNumeric)
str(numbersMirror)
numbersMirror
unique(numbersMirror) # has two times 0.1 ...
sprintf("%.25f", numbersMirror)
sprintf("%.25f", unique(numbersMirror)) # ... because there was a rounding error
Dies kann nützlich sein: http://cran.r-project.org/web/packages/Rmpfr/index.html es ist eine Bibliothek beliebiger Genauigkeit Gleitkomma-Operationen in R. auszuführen –
Die MySQL-Dokumentation macht deutlich, dass DECIMAL keine willkürliche Genauigkeit ist. Es erlaubt mehr Ziffern (64), als in einem "doppelten" dargestellt werden können (53). Es wird auch klargestellt, dass eine Kürzung erwartet wird, wenn die Nachkommastellen den gewählten Grenzwert überschreiten. Ich vermute, dass das Abschneiden auf eine bestimmte Grenze für Doppel die meisten Bedürfnisse erfüllen könnte. –
Schönes Beispiel. Ich löste ein ähnliches Problem mit 'table()' (hier könnte man 'table (numbersMirror)') verwenden. Tabelle scheint die Zahlen zu runden. Ich habe keine Details darüber, wie es rund wird, aber für Ihr Beispiel scheint es zu funktionieren. Wie auch immer: ein dezimaler Datentyp sollte genauer sein. (natürlich nur für -/+ Operationen). @DWin: Ich glaube, du meintest 'round()' anstatt zu trunkieren. –