Представление значений изменяется из-за контрактов методов, которые преобразуют числовые значения в String
, соответственно java.lang.Float#toString(float)
и java.lang.Double#toString(double)
, тогда как фактическое значение остается неизменным. В Javadoc есть общая часть обоих вышеупомянутых методов, которая разрабатывает требования к представлению значений String
:
. Должна быть хотя бы одна цифра для представления дробной части, а за ее пределами , но только столько цифр, сколько требуется, чтобы однозначно отличать значение аргумента от смежных значений
blockquote>. Чтобы проиллюстрировать сходство значимых частей для значений обоих типов, можно выполнить следующий фрагмент :
package com.my.sandbox.numbers; public class FloatToDoubleConversion { public static void main(String[] args) { float f = 125.32f; floatToBits(f); double d = (double) f; doubleToBits(d); } private static void floatToBits(float floatValue) { System.out.println(); System.out.println("Float."); System.out.println("String representation of float: " + floatValue); int bits = Float.floatToIntBits(floatValue); int sign = bits >>> 31; int exponent = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1); int mantissa = bits & ((1 << 23) - 1); System.out.println("Bytes: " + Long.toBinaryString(Float.floatToIntBits(floatValue))); System.out.println("Sign: " + Long.toBinaryString(sign)); System.out.println("Exponent: " + Long.toBinaryString(exponent)); System.out.println("Mantissa: " + Long.toBinaryString(mantissa)); System.out.println("Back from parts: " + Float.intBitsToFloat((sign << 31) | (exponent + ((1 << 7) - 1)) << 23 | mantissa)); System.out.println(10D); } private static void doubleToBits(double doubleValue) { System.out.println(); System.out.println("Double."); System.out.println("String representation of double: " + doubleValue); long bits = Double.doubleToLongBits(doubleValue); long sign = bits >>> 63; long exponent = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1); long mantissa = bits & ((1L << 52) - 1); System.out.println("Bytes: " + Long.toBinaryString(Double.doubleToLongBits(doubleValue))); System.out.println("Sign: " + Long.toBinaryString(sign)); System.out.println("Exponent: " + Long.toBinaryString(exponent)); System.out.println("Mantissa: " + Long.toBinaryString(mantissa)); System.out.println("Back from parts: " + Double.longBitsToDouble((sign << 63) | (exponent + ((1 << 10) - 1)) << 52 | mantissa)); } }
В моей среде выход:
Float. String representation of float: 125.32 Bytes: 1000010111110101010001111010111 Sign: 0 Exponent: 110 Mantissa: 11110101010001111010111 Back from parts: 125.32 Double. String representation of double: 125.31999969482422 Bytes: 100000001011111010101000111101011100000000000000000000000000000 Sign: 0 Exponent: 110 Mantissa: 1111010101000111101011100000000000000000000000000000 Back from parts: 125.31999969482422
Таким образом, вы можете видеть, что знак значений, экспонент одинаковы, а его мантисса была расширена
Используемая логика извлечения чисел с плавающей запятой: 1 и 2 .
g7]
Совершенно ясно, как это?
for (key, value) in col_read {
print(key)
for (innerKey, innerValue) in value {
print(innerKey)
for number in innerValue {
print(number)
}
}
}
PS - Используйте lowerCamelCase для имен переменных, как упомянуто в Рекомендации по разработке API [ 111].