Преобразуйте плавание для удвоения, не теряя точность

Поскольку вы используете C #, вы должны использовать перегрузку конструктора для ChromeDriver, которая позволяет вам указать путь к каталогу, содержащему chromedriver.exe. Для остроумия:

IWebDriver driver = new ChromeDriver(@"C:\my\path\to\chromedriver\directory");
92
задан plinth 27 May 2009 в 14:40
поделиться

5 ответов

Дело не в том, что вы на самом деле получаете дополнительную точность - дело в том, что число с плавающей запятой неточно соответствует тому числу, к которому вы изначально стремились. Двойное число - это , точно представляющее исходное число с плавающей запятой; toString показывает «лишние» данные, которые уже были.

Например (и эти числа неверны, я просто придумываю) предположим, что у вас было:

float f = 0.1F;
double d = f;

Тогда значение f может быть точно 0,100000234523. d будет иметь точно такое же значение, но когда вы преобразуете его в строку, он «поверит», что он точен с более высокой точностью, поэтому не округлится так рано, и вы увидите "лишние цифры", которые уже были там, но скрыты от вас.

Когда вы конвертируете в строку и обратно, вы получаете двойное значение, которое ближе к строковому значению, чем было исходное число с плавающей запятой - но это хорошо , если вы действительно считаете, что строковое значение - это то, что вам действительно нужно.

Вы уверены, что типы float / double подходят для использования здесь вместо BigDecimal ? Если вы пытаетесь использовать числа с точными десятичными значениями (например, деньги), то BigDecimal является более подходящим типом IMO.

Вы уверены, что типы float / double подходят для использования здесь вместо BigDecimal ? Если вы пытаетесь использовать числа с точными десятичными значениями (например, деньги), то BigDecimal является более подходящим типом IMO.

Вы уверены, что типы float / double подходят для использования здесь вместо BigDecimal ? Если вы пытаетесь использовать числа с точными десятичными значениями (например, деньги), то BigDecimal является более подходящим типом IMO.

117
ответ дан 24 November 2019 в 06:27
поделиться

Это связано с контрактом Float.toString (float) , , который частично говорит:

Сколько цифр должно быть напечатано для дробная часть […]? Там должен состоять хотя бы из одной цифры, чтобы представляют собой дробную часть, а помимо этого столько же, , но только столько, цифр, сколько необходимо для однозначного отличить значение аргумента от смежные значения типа float. Который есть, предположим, что x - точное математическое значение, представленное десятичное представление, производимое этот метод для конечного ненулевого аргумент f. Тогда f должно быть поплавком значение, ближайшее к x; или, если два плавают значения одинаково близки к x, то f должен быть одним из них и наименее значительная часть значения f должно быть 0.

25
ответ дан 24 November 2019 в 06:27
поделиться

Используйте BigDecimal вместо float / double . Есть много чисел, которые не могут быть представлены как двоичные числа с плавающей запятой (например, 0,1 ). Таким образом, вы должны либо всегда округлять результат до известной точности, либо использовать BigDecimal .

См. http://en.wikipedia.org/wiki/Floating_point для получения дополнительной информации. 1142786]

7
ответ дан 24 November 2019 в 06:27
поделиться

Поплавки по своей природе неточны и всегда имеют аккуратные «проблемы» с округлением. Если точность важна, вы можете подумать о рефакторинге своего приложения для использования Decimal или BigDecimal.

Да, числа с плавающей запятой в вычислительном отношении быстрее десятичных из-за поддержки процессора. Однако вы хотите быстро или точно?

1
ответ дан 24 November 2019 в 06:27
поделиться

Информацию об этом можно найти в разделе 48 - Избегайте float и double, когда требуются точные значения, Эффективной Java 2-го издания Джошуа Блоха. В этой книге много хороших материалов, и ее определенно стоит посмотреть.

0
ответ дан 24 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: