модификация младших значащих битов в два раза (Java и C ++) - PullRequest
3 голосов
/ 30 сентября 2011

Как обнулить N младших значащих битов в Java и C ++?
В моих вычислениях "... 002" в 1699.3000000000002 вызвано числовой ошибкой, поэтому я бы хотел ее устранить.

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

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

2 голосов
/ 30 сентября 2011

В Java 1e-12*Math.rint(1e12*x) округляет двойное и возвращает в результате двойное.

В C ++ вы можете написать 1e-12*floor(1e12*x + 0.5).

Обратите внимание, что они ведут себя по-разному, если 10 12 x точно между двумя целыми числами. Версия Java будет округляться до четного числа, тогда как версия C ++ всегда будет округляться вверх.

...