C #, десятичные знаки, .ToString и нормализация. Почему мантисса не нормализуется? [Дубликат]

Я ударил эту проблему, используя дистрибутив Anaconda Python на моем компьютере и виртуальную среду conda с Python 3.4.

После выполнения «pip install matplotlib», я мог бы импортировать matplotlit в моем коде, но это дало бы ошибку, когда я попытался построить изображения.

Итак, я вернулся к терминалу и использовал рекомендованную команду conda для Anaconda Python («conda install matplotlib»), и проблема была решена сама собой (помните, что все это было в среде, которую я создал используя командную команду conda в http://conda.pydata.org/docs/using/envs.html ). В моей системе работает Mac OSX 10.10.5.

16
задан Robert Davey 8 June 2010 в 12:17
поделиться

3 ответа

Полезно представить число , в том числе его точность , поэтому 0,5 м можно использовать для обозначения «что-то между 0,45 и 0,55 м» (с соответствующими ограничениями) и 0,50 м можно использовать означает «что-то между 0,495 и 0,545 м».

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

Я считаю, что эта способность впервые появилась в .NET 1.1, btw - я думаю, что десятичные числа в 1.0 всегда были эффективно нормализованы.

12
ответ дан Jon Skeet 19 August 2018 в 19:59
поделиться
  • 1
  • 2
    Это была бы хорошая теория, за исключением того, что количество цифр, возвращаемых операциями деления, не имеет никакого отношения к числу цифр в дивизоре или дивиденде. Для большинства ситуаций, требующих умножения или деления, казалось бы, Decimal должен предложить метод для умножения на Double с результатом округленного до определенного уровня точности; если результат не может обеспечить такую ​​высокую точность, выведите исключение. В противном случае Decimal теряет свои семантические преимущества по сравнению с масштабирующими значениями на 100 (или количеством подразделений на единицу валюты) и используя Double. – supercat 24 May 2012 в 23:28
  • 3
    @supercat: Хм ... вы, конечно, правы в части разделения. По-прежнему может быть, что теория - это способность быть способной представлять число и точность, но практика заключается в том, что она недостаточно хорошо реализована для арифметики. (Конечно, это может быть полезно при распространении данных из другого источника). – Jon Skeet 24 May 2012 в 23:35
  • 4
    @JonSkeet: если бы я разрабатывал тип Decimal, я бы не включил операторы для умножения или разделения двух Decimals; вместо этого я бы потребовал функции с аргументами, указывающими точность. Тем не менее, я бы включил Decimal раз Integer и Decimal раз Long. Я бы также бросил исключение в любое время, когда оператор урезал бы точность. Однако для большинства финансовых приложений, я думаю, лучший тип во многих случаях был бы конкатенацией Double с коэффициентом масштабирования (задан как число, а не мощность, чтобы допускать не десятичные валюты). – supercat 24 May 2012 в 23:45
  • 5
    @supercat: я не понимаю, почему Double (который по своей природе использует мощность 2, а не число, как шкалу), как только это удалено, это еще не Double) было бы разумным выбором. Я также не считаю, что очень важно поддерживать не десятичные валюты, если честно. Сколько жизней разработчиков выиграет от этой поддержки? – Jon Skeet 24 May 2012 в 23:48

Десятичные числа представляют десятичные значения фиксированной точности. Литеральное значение 0.50M имеет встроенную точность с точностью до 2 знаков после запятой, поэтому создаваемая десятичная переменная помнит, что это значение в 2 десятичных знака. Поведение полностью по дизайну.

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

2
ответ дан David M 19 August 2018 в 19:59
поделиться
  • 1
    & Quot; Фиксированная точность & Quot; может вводить в заблуждение. Это тип с плавающей точкой, например float и double - просто точка является десятичной точкой вместо двоичной точки (и пределы разные). – Jon Skeet 8 June 2010 в 12:21

Я думаю, что это было сделано, чтобы обеспечить лучшее внутреннее представление для числовых значений, полученных из баз данных. Двигатели Dbase имеют долгую историю хранения чисел в десятичном формате (избегая ошибок округления) с явной спецификацией количества цифр в значении.

Сравнение десятичных и числовых типов столбцов SQL Server например.

3
ответ дан Hans Passant 19 August 2018 в 19:59
поделиться
  • 1
    Это конкретное отображение между десятичным типом .NET и десятичным типом SQL-сервера, который может создавать проблемы. Если вы используете decimal(19,6) в базе данных и decimal в C #, а затем пользователь вводит 0.5M, когда вы храните его и извлекаете из базы данных, вы вернетесь 0.500000, что более точно чем введенный пользователем. Вам нужно либо сохранить точность в отдельном поле, либо наложить заданную точность поля для всех значений. – Scott Whitlock 24 August 2011 в 12:48
Другие вопросы по тегам:

Похожие вопросы: