Mam prymitywny pływak i potrzebuję jako prymitywny podwójny. Rzucenie spławika na podwójne daje mi dziwną dodatkową precyzję. Na przykład:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Jeśli jednak zamiast rzutowania wyprowadzam zmiennoprzecinkowy jako ciąg i analizuję ciąg jako podwójny, otrzymuję to, czego chcę:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Czy jest lepszy sposób niż pójście do String iz powrotem?
źródło
Znalazłem następujące rozwiązanie:
Jeśli używasz float i double zamiast Float i Double, użyj następujących:
źródło
Użyj
BigDecimal
zamiastfloat
/double
. Istnieje wiele liczb, których nie można przedstawić jako binarne liczby zmiennoprzecinkowe (na przykład0.1
). Tak więc zawsze musisz zaokrąglić wynik do znanej dokładności lub użyćBigDecimal
.Więcej informacji można znaleźć pod adresem http://en.wikipedia.org/wiki/Floating_point .
źródło
BigDecimal
ponieważ to wyłapie większość typowych błędów. Jeśli sprawy przebiegają zbyt wolno, muszą dowiedzieć się więcej i znaleźć sposoby na optymalizację swoich problemów. Przedwczesna optymalizacja jest źródłem wszelkiego zła - DE Knuth.Pływaki z natury są nieprecyzyjne i zawsze mają schludne zaokrąglenia. Jeśli precyzja jest ważna, możesz rozważyć refaktoryzację aplikacji tak, aby używała Decimal lub BigDecimal.
Tak, liczby zmiennoprzecinkowe są obliczeniowo szybsze niż liczby dziesiętne ze względu na obsługę procesora. Czy chcesz jednak szybko lub dokładnie?
źródło
Aby uzyskać informacje, można to znaleźć w punkcie 48 - Unikaj liczby zmiennoprzecinkowej i podwajaj, gdy wymagane są dokładne wartości, drugiego wydania Effective Java autorstwa Joshua Blocha. Ta książka jest pełna dobrych rzeczy i zdecydowanie warta obejrzenia.
źródło
czy to działa?
źródło
Prostym rozwiązaniem, które działa dobrze, jest przeanalizowanie double z ciągu reprezentującego float:
Niezbyt wydajne, ale działa!
źródło