2017-02-10 20 views
-1

Ниже приведен небольшой сегмент кода из моего сценария:больших числа меняют свое значение после применения операции

Логика добавляемый к тайному любому значению данных согласно значению шкалы

x = "11400000206633458812"  
scale = 2  
x = x.to_f/10**scale.to_i  
x = x == x.to_i ? x.to_i : x  
puts x 

заметить, что значение «114000002066334592»

, который отличается от начального значения x.

На данный момент мои тестовые точки не работают.

x может быть любым значением. Если я использую x = 156, вывод правильный, но когда длина целого числа превышает 16 цифр, возникает проблема.

Ожидаемый выход в вышеупомянутом случае является 114000002066334588

Может кто-нибудь помочь мне, почему значение меняется, и как это исправить?

+0

@AndreyDeineko, х на самом деле строка .. Если я использую x.to_d, он дает мне ошибку: неопределенный метод 'to_d» для "11400000206633458812": String (NoMethodError) –

+1

_» большие целые числа меняют свое значение "_ -' x.to_f' не возвращает целое число. – Stefan

ответ

0

The expected output in above case is 114000002066334588

Совсем нет.

Нельзя ожидать, что операции с плавающей точкой будут точными. Это всего лишь не случайbecause of processor architecture. В все языки, без каких-либо исключений, есть обходные пути для точной работы с десятичными знаками. В рубина это BigDecimal:

require 'bigdecimal' 

BigDecimal("11400000206633458812")/100 
#⇒ 0.11400000206633458812E18 

(BigDecimal("11400000206633458812")/100).to_i 
#⇒ 114000002066334588 

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

  • Нет связанных вопросов^_^