首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tostring("000.0")生成错误的值

tostring("000.0")生成错误的值
EN

Stack Overflow用户
提问于 2013-04-03 00:02:51
回答 6查看 280关注 0票数 3

在我的c#控制台应用程序中,我希望将双精度变量转换为字符串类型。但是结果字符串变量应该至少有小数点左边的3位和小数点右边的1位。示例: 3.4569应转换为"003.4“

它对上面的例子有效,但对于后面的转换抛出错误的结果。

代码语言:javascript
运行
复制
 double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
 string StringNum = Num .ToString("000.0");

它的结果..

代码语言:javascript
运行
复制
 StringNum ="6578336356630530.0";

但这将会是..。

代码语言:javascript
运行
复制
 StringNum ="6578336356630531.0";

如何获取这些类型数字的确切字符串值??

代码语言:javascript
运行
复制
 //decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N));
 //this conversion also looses original value

谢谢..。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-03 00:06:54

问题是您存储的值恰好是6578336356630531。没有更接近6578336356630530的double值。因此,对于执行时存在的数据,输出是正确的。

来自the documentation

所有浮点数的有效位数也是有限的,这也决定了浮点值近似实数的精确度。双精度值的精度最多为15位小数,但内部最多保留17位。

你在吹毛求疵地说第16位数字。

我有一个handy class,它可以让你看到任何double的确切值。

如果您需要更高的精度,请使用decimal而不是double。请注意,decimal的范围较小,但精度较高。

票数 3
EN

Stack Overflow用户

发布于 2013-04-03 00:07:28

你会用小数点吗?

代码语言:javascript
运行
复制
decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");

double是一个近似精度的浮点型。See here.

文章摘录:

浮点值和精度损失

请记住,浮点数只能近似十进制数,并且浮点数的精度决定了该数字近似十进制数的精度。默认情况下,双精度值包含15位小数精度,但内部最多保留17位。浮点数的精度有几个结果:在特定精度下看起来相等的两个浮点数可能不相等,因为它们的最低有效位不同。如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数。如果涉及浮点数,则值可能不会往返。如果操作将原始浮点数转换为另一种形式,反向操作将转换后的形式转换回浮点数,并且最终的浮点数等于原始浮点数,则称该值为往返。往返可能会失败,因为一个或多个最低有效数字在转换过程中丢失或更改。

票数 2
EN

Stack Overflow用户

发布于 2013-04-03 00:06:47

使用decimal而不是double,一切都会好起来:

代码语言:javascript
运行
复制
decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");

这个问题与双值表示和精度有关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15768776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档