Как мне сохранить число с плавающей точкой в ​​рубине - PullRequest
2 голосов
/ 08 ноября 2010

Итак, я пробую код для преобразования чисел в строки. Однако я заметил, что в некоторых случаях он не сохраняет последние два десятичных знака. Например, я набираю 1.01 и 1.04 для добавления, и я возвращаюсь 2.04. Если я наберу только 1.05, он сохранит число и вернет его точно. Я понимаю, что происходит, вещи округляются. Я не знаю, как не допустить его округления. Должен ли я просто посылать (1.01 + 1.04) себе только один вход?

Внимание! Я еще не пробовал, поэтому не знаю, поддерживается ли он:

 user_input = (1.04+1.01) #entry from user
 user_input = gets.to_f
 user_input.to_test_string

Что у меня так далеко:

    class Float
     def to_test_string

      cents = self % 1
      dollars = self - cents
      cents = cents * 100

      text = "#{dollars.to_i.en.numwords} dollars and #{cents.to_i.en.numwords} cents"

      puts text
      text
     end
    end
  puts "Enter two great floating point numbers for adding"
  puts "First number"
  c = gets.to_f
  puts "Second number"
  d = gets.to_f
  e = c+d
  puts e.to_test_string
  puts "Enter a great floating number! Example 10.34"
  a = gets.to_f 
  puts a.to_test_string

Спасибо за помощь! Разместите код, чтобы я мог попробовать!

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010
$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1.04+1.01
2.0499999999999998

Прочитайте это: Что должен знать каждый компьютерщик об арифметике с плавающей точкой

Кроме того, что сказал Накилон.

1 голос
/ 08 ноября 2010

Это не проблема ни с ruby, ни с вашим кодом (хотя вам нужно избавиться от .en.numwords); проблема с двоичным представлением с плавающей запятой.

Вы должны использовать Fixnum или Bignum для представления валюты.

например.

class Currency
    def initialize str
        unless str =~ /([0-9]+)\.([0-9]{2})/
            raise 'invalid currency string'
        end
        @cents = $1.to_i * 100 + $2.to_i
    end
end
...