c # деление дает нечетный результат на несколько вызовов - PullRequest
0 голосов
/ 09 декабря 2010

У нас есть класс, отвечающий за преобразование внутренних единиц для отображения единиц.Таким образом, если наши единицы отображения равны m, а внутренние единицы - мм, это разделит внутренние единицы на коэффициент преобразования 1000. Пользователь может добавлять объекты в систему с различными координатами x, y, z.У нас есть странное событие, когда пользователь вводит единицы измерения на 1000 мм, поэтому на дисплее отображается 1 м.входной сигнал постоянно равен 1000 мм, но время от времени деление 1000/1000, похоже, выбрасывает .9999999м вместо 1м.таким образом, в нашей сетке у нас есть 1м, 1м, 1м, 1м, 0,9999м, 1м, 1м и т. д. Иногда .9999м никогда не появляется, иногда это происходит сразу, иногда это происходит после 20-100 входов.Мы расследуем, происходит ли что-то странное на входной стороне, но мне было интересно, сталкивался ли кто-нибудь еще с чем-то подобным?

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

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

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

0 голосов
/ 14 декабря 2010

Спасибо за вашу помощь, мы отследили ее до странного побочного эффекта от ввода другого объекта.

Проблема заключается в том, что если другой объект вставляется кратным 3 раз, возникает ошибка, например, Объект A вводится 3 раза на 1 м, все в порядке, затем после ввода этого объекта B на 1 м появляется 0,9999 м, однако, если объект A вводится 1,2,4 или 5 раз, проблем нет. 6 раз, и проблема появляется снова, 9 раз и т. Д. Какое у нас удовольствие.

0 голосов
/ 09 декабря 2010

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

var str = string.format("{0.000000000}", funkyVal);

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

...