2015-12-01 3 views
0
30.0 * 0.009 # => 0.26999999999999996 

Кто-нибудь знает, почему это не 0.27?Неожиданное поведение рубинового поплавка при умножении

Любые рекомендации по поводу того, что с этим делать?

+4

Вот как работают числа с плавающей точкой. «Мы плаваем с боргом, точность не имеет значения, вы будете приближены», –

+1

, пожалуйста, прочтите это http://www.rails-troubles.com/2011/12/ruby-float-quirks.html?m=1 – bmalets

+0

Я читаю Это. Автор предлагает использовать BigDecimal между прочим. Я сейчас читаю. Что вы делаете в своей базе кода, если раньше вы исправляли эту проблему? Я смотрю «Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой». Там также хорошая статья, сравнивающая разные языки http://itreallymatters.net/post/386327451/floating-point-arithmetics-in-19-programming#.Vl4WN3arRpg. –

ответ

1

Поскольку вы уже нашли материалы на почему тема, я просто ответить на что делать часть вопроса. Если вы абсолютно не хотите приближаться, вы должны использовать рациональные числа:

30 * 0.009r # => (27/100) 
+0

Наверное, вы подразумеваете «рациональный», а не «реальный». – sschmeck

+0

'0,009r' - это рациональное число, которое является подмножеством действительных чисел. – steenslag

+0

@sschmeck, спасибо за исправление, вы правы. – ndn

Смежные вопросы