在我的c#控制台应用程序中,我想将double变量转换为字符串类型。但是结果字符串变量应该至少有3位数到小数点左边和一位数到右边。 例如:3.4569应转换为“003.4”
它适用于上面的示例,但是后续转换会产生错误的结果。
double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
string StringNum = Num .ToString("000.0");
结果..
StringNum ="6578336356630530.0";
但它会...... ..
StringNum ="6578336356630531.0";
如何获得这些类型数字的确切字符串值?
//decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N));
//this conversion also looses original value
感谢名单..
答案 0 :(得分:3)
问题在于您正在存储的值 正是6578336356630531
。没有double
值更接近6578336356630530.因此输出对于执行时出现的数据是正确的。
所有浮点数也具有有限的有效位数,这也决定了浮点值接近实数的精确程度。 Double值最多包含15个十进制数字的精度,但内部最多保留17位数。
你正在讨论第16位数字。
我有一个handy class,可让您查看任何double
的完全值。
如果您需要更高的精确度,请使用decimal
代替double
。请注意,decimal
的范围较小,但精度较高。
答案 1 :(得分:2)
你能用小数吗?
decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");
double
是一个近似精度的浮点数。 See here.
文章摘录:
浮点值和精度损失
请记住a 浮点数只能近似一个十进制数,那就是 浮点数的精度决定了准确度 该数字近似于十进制数。默认情况下,为Double值 包含15个十进制数字的精度,但最多为17 数字在内部维护。浮点精度 数字有几个结果:两个浮点数 对于特定精度看起来相等可能不等于相等 因为他们的最低有效数字是不同的。数学 或使用浮点数的比较操作可能不会 如果使用十进制数,则产生相同的结果,因为 浮点数可能不完全接近小数 数。如果浮点数是,则值可能不会往返 参与其中。如果操作转换了一个值,则称该值为往返 原始浮点数到另一种形式,反向运算 将转换后的表单转换回浮点数,然后转换为 最终浮点数等于原始浮点数 数。往返可能会失败,因为一个或多个最不重要 数字在转换中丢失或更改。
答案 2 :(得分:0)
使用decimal
代替double
,一切正常:
decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");
问题与双值表示和精度有关。
答案 3 :(得分:0)
double
无法存储该精度。如果这是您想要的行为,请使用decimal
。
答案 4 :(得分:0)
您似乎找到了一个无法正确表示浮点数的数字。
尝试使用小数代替:
decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");
答案 5 :(得分:0)
没有以双精度舍入的最大整数是2 ^ 53 - 1,大约是9e15,但是你有6e15,这可能可以很好地表示,但不一定。你运气不好(通常是运气不好;处理它)。如果你想在没有这些惊喜的情况下生活,你必须在c#中使用十进制类型。