Erlang плавает и усекается

R15b в Windows дает:

>trunc(1.9999999999999999999).
2

Если на то пошло, просто набрав число с плавающей запятой, вы получите:

> 1.9999999999999999999.              
2.0

Насколько я знаю, функция усечения должна просто отбрасывать дробную часть (по крайней мере, это то, что мне нужно). Функция пола также могла бы помочь, насколько я знаю, но реализации пола, которые я видел в Интернете, используют... как вы уже догадались... trunc.

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

Любые идеи по этому поводу?

Спасибо.


person R G    schedule 27.04.2012    source источник
comment
Если вам нужны правильные числа, не используйте числа с плавающей запятой.   -  person Wooble    schedule 27.04.2012
comment
Бесполезно: 1) Это даже не попытка ответить на мой вопрос. 2) На самом деле моя потребность в усечении — это попытка уйти от поплавков и работать с прямыми целыми числами.   -  person R G    schedule 27.04.2012
comment
Вот почему я не опубликовал это как ответ. Ваша проблема в том, что реализация с плавающей запятой, совместимая с IEEE, не может представить число 1.99999999999999999999 в двоичном виде как что-либо иное, чем 2.0.   -  person Wooble    schedule 27.04.2012
comment
Связанный? stackoverflow.com/questions/4006201/truncate-a-float -in-erlang   -  person Roberto Aloi    schedule 27.04.2012
comment
Wooble, ЭТО то, что вы должны опубликовать в качестве ответа.   -  person Emil Vikström    schedule 27.04.2012
comment
@ Роберт Алои - спасибо, немного полезно. Я надеялся сделать это с помощью математического усечения, но в крайнем случае я могу сделать это с усечением строки.   -  person R G    schedule 27.04.2012
comment
Попробуйте прочитать docs.oracle.com/cd/E19422-01/ 819-3693/ncg_goldberg.html или floating-point-gui.de, которые сообщают все.   -  person rvirding    schedule 27.04.2012
comment
У меня глаза стекленели даже от того, что я смотрел на это. Если мне нужно знать все это, чтобы использовать числа с плавающей запятой, думаю, в будущем я буду избегать их, как чумы.   -  person R G    schedule 28.04.2012
comment
Вы должны смотреть либо на использование соотношения, либо на десятичный тип. Модуль отношения довольно прост в реализации.   -  person dsmith    schedule 28.04.2012


Ответы (2)


Ваша проблема заключается в том, что десятичные числа представлены в виде двоичного представления, совместимого с IEEE (32, 64 или 128 бит).

Если вам действительно нужна точность, вам следует использовать другие числовые структуры данных, такие как двоично-десятичный код или арифметика с фиксированной точкой.

Надеюсь это поможет!

person Vincenzo Maggio    schedule 02.05.2012

если вы хотите, чтобы TRUNC плавал, возможно, это может помочь:

select substring (convert(varchar(14), CAST (20160303013458 as varchar(14))) , 1 , 8)
person Hpeck    schedule 27.12.2017
comment
Вопрос конкретно об Erlang, а не о SQL, поэтому это совершенно не связано. - person Pyves; 27.12.2017