Почему. net C# float усекается до тысячи в строковом представлении? - PullRequest
0 голосов
/ 02 марта 2020

Почему возможно следующее?

immediate console:
"{0:F20},{1:F20}, {2:F20}".format(
     res_ts, // float
     AppMgr.logon_info.res_ts, //float
     res_ts - AppMgr.logon_info.res_ts
)
"{0},{1}, {2}".format(
     res_ts, 
     AppMgr.logon_info.res_ts, 
     res_ts - AppMgr.logon_info.res_ts
)

result:
"3791785000.00000000000000000000,
 3791785000.00000000000000000000, 
       -512.00000000000000000000"
"3.791785E+09,
 3.791785E+09, 
-512"

Почему они выглядят одинаково, но имеют разницу -512? res_ts AppMgr.logon_info.res_ts сохраняется и перезагружается из строки.

Обновление: простое тестирование на .Net4:

float a = 3791785472f;
Console.WriteLine(String.Format("{0:F20}, {1}",a, a) );
Console.WriteLine(String.Format("{0:0.#}, {1:00.#}",a, a) );
Console.WriteLine(String.Format("{0:0.#}, {1:0,0.#}",a, a) );
Console.WriteLine(String.Format("{0:#.#}, {1:0,0.#}",a, a) );

результаты:

3791785000.00000000000000000000, 3.791785E+09
3791785000, 3791785000
3791785000, 3,791,785,000
3791785000, 3,791,785,000

ссылка: https://dotnetfiddle.net/hTEFGr

Все усекается до тысячи в строковом представлении. Интересно, что мне нужно сделать, чтобы сохранить большое число с плавающей точкой в ​​виде строки без усечения до тысячи?

Обновление:

double a = 3791785472f;
Console.WriteLine(String.Format("{0:F20}, {1}",a, a) );
Console.WriteLine(String.Format("{0:0.#}, {1:00.#}",a, a) );
Console.WriteLine(String.Format("{0:0.#}, {1:0,0.#}",a, a) );
Console.WriteLine(String.Format("{0:#.#}, {1:0,0.#}",a, a) );

3791785472.00000000000000000000, 3791785472
3791785472, 3791785472
3791785472, 3,791,785,472
3791785472, 3,791,785,472

Упс. Но почему нет переполнения или каких-либо ошибок? Звучит как рискованное дело. Может быть, я должен просто избегать плавания везде, где я могу?

...