Ответ 1
Как определяется количество значимых цифр во время математических операций?
Это указано в ECMA-334 спецификации С# 4 11.1.7 с .112
Десятичное число представлено как целое число, масштабируемое степенью десяти. Для десятичные числа с абсолютным значением менее 1,0 м, это значение точно для по крайней мере, на 28-м знаке после запятой. Для десятичных знаков с абсолютным значением больше или равно 1,0 м, значение точно не менее 28 цифры.
Сохраняется ли количество значимых цифр во время сериализации?
Да, с сериализацией значение и его точность не меняются
[Serializable]
public class Foo
{
public decimal Value;
}
class Program
{
static void Main(string[] args)
{
decimal d1 = decimal.Parse("1.0000");
decimal d2 = decimal.Parse("1.00");
Debug.Assert(d1 ==d2);
var foo1 = new Foo() {Value = d1};
var foo2 = new Foo() {Value = d2};
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("data.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, d1);
stream.Close();
formatter = new BinaryFormatter();
stream = new FileStream("data.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
decimal deserializedD1 = (decimal)formatter.Deserialize(stream);
stream.Close();
Debug.Assert(d1 == deserializedD1);
Console.WriteLine(d1); //1.0000
Console.WriteLine(d2); //1.00
Console.WriteLine(deserializedD1); //1.0000
Console.Read();
}
}
Влияет ли текущая культура на то, как это обрабатывается?
Текущая культура влияет только на то, как десятичная строка может быть проанализирована из строки, например, она может обрабатывать '.' или ',' как десятичную символа точки или символа валюты, если вы его предоставите, например "£ 123.4500". Культура не изменяет способ хранения объекта внутри, и это не влияет на его точность.
Внутри decimal имеет мантисс, экспоненту и знак, поэтому нет места ни для чего другого.