Почему возможно следующее?
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
Упс. Но почему нет переполнения или каких-либо ошибок? Звучит как рискованное дело. Может быть, я должен просто избегать плавания везде, где я могу?