99999999.33333333 -> 100000000.0000000 98888888.33333333 -> 98888888.0000000 2974815.78000000 -> 2974815.7500000
public class Main { static void testDoubleToFloat(double d) { float f = (float) d; System.out.println(); System.out.println(String.format("double %.10f\t%s", d, Long.toBinaryString(Double.doubleToRawLongBits(d)))); System.out.println(String.format("float %.10f\t %s", f, Integer.toBinaryString(Float.floatToRawIntBits(f)))); } public static void main(String[] args) { System.out.println(String.format("double: %.10f / %.10f", Double.MIN_VALUE, Double.MAX_VALUE)); System.out.println(String.format("float: %.10f / %.10f", Float.MIN_VALUE, Float.MAX_VALUE)); /* , double. */ testDoubleToFloat(99999999.0 + 1.0 / 3.0); // testDoubleToFloat(98888888.0 + 1.0 / 3.0); // testDoubleToFloat(2974815.78); testDoubleToFloat(-2974815.78); } }
double: 0.0000000000 / 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000 float: 0.0000000000 / 340282346638528860000000000000000000000.0000000000 double 99999999.3333333300 100000110010111110101111000001111111101010101010101010101010101 float 100000000.0000000000 1001100101111101011110000100000 double 98888888.3333333300 100000110010111100100111011001011100001010101010101010101010101 float 98888888.0000000000 1001100101111001001110110010111 double 2974815.7800000000 100000101000110101100100010111111100011110101110000101000111101 float 2974815.7500000000 1001010001101011001000101111111 double -2974815.7800000000 1100000101000110101100100010111111100011110101110000101000111101 float -2974815.7500000000 11001010001101011001000101111111
/opt/jdk1.7/bin/java -version java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
java -version java version "1.7.0_25" OpenJDK Runtime Environment (IcedTea 2.3.12) (7u25-2.3.12-4ubuntu3) OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
public class Main { static void testDoubleToFloat(double d) { float f = (float) d; Float f2 = new Float(d); float f3 = Float.parseFloat(new Double(d).toString()); float f4 = Float.parseFloat(String.format("%.10f", d)); System.out.println(); System.out.println(String.format("double %.10f\t%s", d, Long.toBinaryString(Double.doubleToRawLongBits(d)))); System.out.println(String.format("float %.10f\t %s", f, Integer.toBinaryString(Float.floatToRawIntBits(f)))); System.out.println(String.format("Float %.10f\t %s", f2, Integer.toBinaryString(Float.floatToRawIntBits(f2)))); System.out.println(String.format("float %.10f\t %s", f3, Integer.toBinaryString(Float.floatToRawIntBits(f3)))); System.out.println(String.format("float %.10f\t %s", f4, Integer.toBinaryString(Float.floatToRawIntBits(f4)))); } public static void main(String[] args) { System.out.println(String.format("double: %.10f / %.10f", Double.MIN_VALUE, Double.MAX_VALUE)); System.out.println(String.format("float: %.10f / %.10f", Float.MIN_VALUE, Float.MAX_VALUE)); testDoubleToFloat(99999999.0 + 1.0 / 3.0); testDoubleToFloat(98888888.0 + 1.0 / 3.0); testDoubleToFloat(2974815.78); testDoubleToFloat(-2974815.78); } }
double: 0.0000000000 / 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000 float: 0.0000000000 / 340282346638528860000000000000000000000.0000000000 double 99999999.3333333300 100000110010111110101111000001111111101010101010101010101010101 float 100000000.0000000000 1001100101111101011110000100000 Float 100000000.0000000000 1001100101111101011110000100000 float 100000000.0000000000 1001100101111101011110000100000 float 100000000.0000000000 1001100101111101011110000100000 double 98888888.3333333300 100000110010111100100111011001011100001010101010101010101010101 float 98888888.0000000000 1001100101111001001110110010111 Float 98888888.0000000000 1001100101111001001110110010111 float 98888888.0000000000 1001100101111001001110110010111 float 98888888.0000000000 1001100101111001001110110010111 double 2974815.7800000000 100000101000110101100100010111111100011110101110000101000111101 float 2974815.7500000000 1001010001101011001000101111111 Float 2974815.7500000000 1001010001101011001000101111111 float 2974815.7500000000 1001010001101011001000101111111 float 2974815.7500000000 1001010001101011001000101111111 double -2974815.7800000000 1100000101000110101100100010111111100011110101110000101000111101 float -2974815.7500000000 11001010001101011001000101111111 Float -2974815.7500000000 11001010001101011001000101111111 float -2974815.7500000000 11001010001101011001000101111111 float -2974815.7500000000 11001010001101011001000101111111
/* * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ ... public final class Float extends Number implements Comparable<Float> { ... public Float(double value) { this.value = (float)value; } ... }
return (float)Double.longBitsToDouble( lbits );
float f = (float) d;
double 2974815.7800000000 100000101000110101100100010111111100011110101110000101000111101 float 2974815.7500000000 1001010001101011001000101111111
double 2974815.7800000000 0 10000010100 0110101100100010111111100011110101110000101000111101 float 2974815.7500000000 0 10010100 01101011001000101111111
CUSTOMER SUBMITTED WORKAROUND:
Avoiding direct String-to-float conversion by using intermediate doubles.
BigDecimal bg = new BigDecimal("2974815.78"); System.out.println(bg);
class Currency { long value; ... public double asDouble() { return value / 100.0; } ... < , .. , , StringTokenizer> ... }
Source: https://habr.com/ru/post/201066/
All Articles