Понятно, что вы не можете рассчитывать на то, что всегда вернете исходное число, так как есть много чисел, которые отображаются на одно и то же число. Например, вы не можете различить эти числа:
3.0099999999999997868371792719699442386627197265625
3.009999999999999786837179271969944238662
3.009999999999999786837179271
3.0099999999999997
3.01
Однако у Python есть интересный подход: если вы дадите ему номер 3.0099999999999997868371792719699442386627197265625, он ответит 3.01:
Python 2.7.2+ (default, Nov 30 2011, 19:22:03)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 3.0099999999999997868371792719699442386627197265625
3.01
Это потому, что 3.01
- самая короткая строка, которая дает то же число с плавающей запятой. Другими словами, это самый короткий x
, так что
float(repr(x)) == x
где repr
- это функция Python, которая превращает объект в строку (здесь он превращает 3.0099...
в 3.01
), а float
преобразует строку в число с плавающей точкой.
Существует множество строк, которые приведут к одному и тому же внутреннему плавающему значению, но это самое короткое и, следовательно, "вероятно", то, что вы имели в виду.
Эта функция была добавлена в Python 2.7 , в качестве бэкпорта для функции Python 3.1. Он был обсужден в Issue1580 , и вы сможете найти там код и перевести его на Java, если хотите.