C# tostring(“000.0”)生成错误的值
在我的c#控制台应用程序中,我想将双变量转换为字符串类型。但结果字符串变量应该在小数点左边至少有3位,右边至少有一位。 示例:3.4569应转换为“003.4” 它适用于上面的示例,但为下面的转换抛出错误的结果C# tostring(“000.0”)生成错误的值,c#,string,tostring,C#,String,Tostring,在我的c#控制台应用程序中,我想将双变量转换为字符串类型。但结果字符串变量应该在小数点左边至少有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 ="657833
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
Thanx..使用
十进制
而不是双精度
,一切正常:
decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");
该问题与双值表示和精度有关。
double
无法存储该精度。如果这是您想要的行为,请使用十进制。问题在于您存储的值正是6578336356630531
。没有接近6578336356630530的double
值。因此,对于执行时显示的数据,输出是正确的
发件人:
所有浮点数的有效位数也有限,这也决定了浮点数逼近实数的精度。双精度值的精度最高为15位小数,但内部最多保留17位小数
你在琢磨第16位数字
我有一个可以让你看到任何double
的精确值的
如果需要更高的精度,请使用decimal
而不是double
。请注意,decimal
的范围较小,但精度较高。您似乎找到了一个无法用浮点数字正确表示的数字
请尝试改用十进制:
decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");
你能用十进制吗
decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");
double
是近似精度的浮点
文章节选:
浮点值和精度损失
记得吗
浮点数只能近似于一个十进制数
浮点数的精度决定了精度
那个数字近似于十进制数。默认情况下,一个双精度值
包含15位精度的十进制数字,但最大值为17
数字在内部维护。浮点的精度
数字有几个后果:两个浮点数
特定精度的“显示相等”可能与“比较相等”
因为它们的最低有效位是不同的。数学模型
或者使用浮点数的比较操作可能不会
如果使用十进制数,则产生相同的结果,因为
浮点数可能与十进制数不完全接近
号码。如果使用浮点数,则值可能不会往返
卷入的如果某个操作转换了
将原始浮点数转换为另一种形式,进行逆运算
将转换后的表单转换回浮点数,然后
最终浮点数等于原始浮点数
号码。往返可能会失败,因为一个或多个最不重要的
数字在转换过程中丢失或更改
double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
string StringNum = Num .ToString("000.0");
不带双精度舍入的最大整数是2^53-1,约为9e15,但有6e15,可能精确表示,但不一定。你运气不好(通常是一种坏运气;处理它)。如果你想生活中没有这些惊喜,你必须在c#中使用十进制类型 看来你正处于精确的边缘。尝试if(6578336356630531.0==6578336356630530.0)Console.WriteLine(“精度问题”)代码>我得到N=22作为输入,然后我使用N作为以下内容,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0那么对于数学函数,我使用了双变量…@durgesh.patle kay bhau,tya yed***ghabarun tumhi post delete kelit?哦,玛拉蒂啊,图米·玛拉蒂……。@durgesh.patle hi,aapali,hakkachi聊天室啊,我的朋友们,我是马哈拉施特拉·纳瓦尼曼senechaaaa@Freelancer:…vijay aso,ghabarun post delete nahi keli bhau,-ve points mule post delete keli.,聊天室chya mahitisathi dhanyawad..我将N作为输入,然后使用N,如下所示,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0表示N=22,因此对于数学函数,我使用了双变量。.错误:不舍入的最大精度为2^52-1,这会使您的数字超出限制,这不是运气,它肯定会被舍入。Thanx先生,但我得到N=22作为输入,并使用如下,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0所以对于数学函数,我使用了双变量,不能使用pow或sqrtdecimal@durgesh.patle:您只需了解,如果您使用的是双精度
,则应忽略第15位有效数字以外的任何内容。你想要得到的数字基本上是无法用double来表示的。