То, что вы показываете, не decimal
- это float
.Они очень разные типы.f
- это суффикс для float
, он же System.Single
.m
- это суффикс для decimal
, он же System.Decimal
.Из вашего вопроса не ясно, думали ли вы, что на самом деле это был decimal
, или вы просто использовали float
для демонстрации своих страхов.
Если вы используете 1.0000000000001m + 1.0000000000001m, вы получите точноправильное значение.Обратите внимание, что, кстати, версия double
не могла точно выразить ни одно из отдельных значений.
У меня есть статьи по обоим видам с плавающей запятой в .NET, и вы должны прочитать их полностью,наряду с другими ресурсами:
Конечно, все типы с плавающей запятой имеют свои пределы, но, в частности, вы должны не ожидать, что двоичная с плавающей запятой будет точно представлять десятичные значения, такие как 0,1.Тем не менее, он не может представлять что-либо, что не может быть точно представлено в 28/29 десятичных цифрах - поэтому, если вы разделите 1 на 3, вы, конечно, не получите точного ответа.
Вы также должны отметитьчто диапазон decimal
значительно меньше, чем double
.Таким образом, хотя он может иметь точность 28-29 десятичных цифр, вы не можете представлять действительно огромные числа (например, 10 200 ) или минимальные числа (например, 10 -200 ).