Арифметика в рубине

Используйте класс WebClient от Системы. Сеть; на.NET 2.0 и выше.

WebClient Client = new WebClient ();
Client.DownloadFile("http://mysite.com/myfile.txt", " C:\myfile.txt");
6
задан mskfisher 10 May 2012 в 17:17
поделиться

6 ответов

Проблема в том, что некоторые числа, которые мы можем легко записать в десятичном формате, не имеют точного представления в конкретном формате с плавающей запятой, реализованном на современном оборудовании. Случайным образом можно сказать, что все целые числа, но не все дроби, потому что мы обычно храним дробь с показателем 2 ** e . Итак, у вас есть 3 варианта:

  1. Округлить соответствующим образом. Неокругленный результат всегда действительно очень близок, поэтому округленный результат неизменно «идеален». Это то, что делает Javascript, и многие люди даже не осознают, что JS все делает с плавающей запятой.

  2. Используйте арифметику с фиксированной запятой. Ruby действительно упрощает эту задачу; это один из немногих языков, который плавно переходит на Class Bignum с Fixnum по мере увеличения числа.

  3. Используйте класс, предназначенный для решения этой проблемы, например BigDecimal

Чтобы рассмотреть проблему более подробно, мы можем попытаться представить ваше «7.3» в двоичном формате. Часть 7 проста, 111, но как нам сделать .3? 111,1 - это 7,5, слишком большой, 111,01 - это 7,25, приближается. Оказывается, 111.010011 - это «следующее ближайшее меньшее число», 7.296875, и когда мы пытаемся заполнить недостающее .003125, в конечном итоге мы обнаруживаем, что это просто 111.010011001100110011 ... навсегда, не представимо в выбранной нами кодировке в конечной битовой строке. .

6
ответ дан 8 December 2019 в 03:01
поделиться

Проблема в том, что с плавающей запятой неточна . Вы можете решить эту проблему с помощью Rational,

3
ответ дан 8 December 2019 в 03:01
поделиться

Это обычная ошибка из-за того, как числа с плавающей запятой представлены в памяти.

Используйте BigDecimal, если вы требуются точные результаты.

result=BigDecimal.new("7.3")-BigDecimal("7.2")
puts "%2.2f" % result
1
ответ дан 8 December 2019 в 03:01
поделиться

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

Если вы хотите получить более точный ответ с заданной точностью, просто умножьте на это число с плавающей запятой. (например, на 100), преобразовать его в int, посчитать, затем разделить.

Есть и другие решения, но я считаю это самым простым, поскольку округление всегда кажется мне немного сомнительным.

Это был задан ранее здесь, вы можете поискать некоторые из ответов, данных ранее, например этот: Решение проблем точности в числах с плавающей запятой

0
ответ дан 8 December 2019 в 03:01
поделиться

Интересно отметить, что число, которое имеет несколько десятичных знаков в одном основании, как правило, может иметь очень большое количество десятичных знаков в другом. Например, требуется бесконечное количество десятичных знаков, чтобы выразить 1/3 (= 0,3333 ...) в основании 10, но только одно десятичное число в базе 3. Точно так же требуется много десятичных знаков, чтобы выразить число 1/10 ( = 0,1) в основании 2.

1
ответ дан 8 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

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