C# 将双精度转换为字符串并仅在需要时显示十进制值

C# 将双精度转换为字符串并仅在需要时显示十进制值,c#,typeconverter,C#,Typeconverter,我想将以下3个双精度值转换为字符串 Double value converted string value 1 1 1.200 1.200 1.666 1.666 我希望输出字符串值的格式与double相同。在上述值中,表示1没有任何十进制值,因此它将保持不变。在1.200的情况下,它将给我字符串1.200和1.666相同。但是我尝试了.ToString()

我想将以下3个双精度值转换为字符串

Double value            converted string value
1                       1
1.200                   1.200
1.666                   1.666

我希望输出字符串值的格式与double相同。在上述值中,表示1没有任何十进制值,因此它将保持不变。在1.200的情况下,它将给我字符串1.200和1.666相同。但是我尝试了.ToString()方法,但它将零值截断为1.200。但我不想要这个。我想要字符串格式的实际值。

我承认我不喜欢这样做,但是我为Double类型编写了一个扩展方法来格式化它。请随意更改有趣的名称。:)

C#或任何其他语言(包括SQL)不会根据浮点类型在代码中的表示形式对浮点类型(
float
double
)的值产生差异

这意味着编译器不会对以下各项产生影响:

double v1 = 1;

您所说的(在注释中)获取这些值的数据库也不存在

数据库以某种方式显示小数的原因是应用于结果集的预定义格式。这可以由您使用的数据库工具定义,也可以取决于您的区域设置系统设置。无论如何,.NET framework为您提供了以下功能:

您需要决定哪种格式最适合您的需要并使用它。例如,这将使用点后4位小数对数字进行格式化:

String.Format("{0:0.0000}", v1); // outputs 1.0000
String.Format("{0:0.0000}", v2); // outputs 1.0000 too

如果您已经知道所需的格式,请调整格式字符串(第一个参数类似于
“{0:0000}”
,以最符合您的要求。

我认为您不需要“实际”值(即1.20000000000001)“我希望输出字符串值的格式与double相同”-你的意思是你想区分1.20和1.200的原始字符串输入吗?如果是这样,
double
是错误的类型。如果这不是你的意思,你真的需要澄清你的问题。我们不知道数据来自何处,或者你所说的“与double格式相同”是什么意思。如果要控制double的输出,请使用格式。例如
string.Format(“{0:0.000}”,myDouble)
方法将格式化一个double,使其在小数点的左侧至少有一个符号,在右侧有3个位置。如果您想在变量声明中输出准确的值,并在
double v1=1;
double v2=1.000;
之间进行区分,则
double
不是您的数据类型-语言ma除非两者都是字符串,否则
1
1.000
之间没有区别。Hi@JonSkeet,我的意思是我不想在小数点后截断零值。实际上这些值来自数据库。所以我希望这些值保持不变(相同的小数点)字符串转换后,如果存储为双精度类型,则.C#不会区分1.2、1.200和1.20000。如果创建3个双精度变量,并将这些值分配给它们,然后打印出来或执行相互比较测试,则它们都是相等的。因此,使用一个双重类型,你只能用专门的格式打印它们。(编辑:Ivaylo说了基本相同的事情,我在发布我的评论之前没有注意到。)请注意,这将不能处理一个双份的全部范围。希望您的数据有着合理的价值。我认为这种方法唯一愚蠢的是您选择的名称。也许,如果格式作为参数(而不是硬编码),我甚至会考虑在日常工作中使用这种方法(而不是开玩笑):对于C#中的
十进制
,情况并非如此。1.00m和1.0000m不同-请尝试打印出来。双精度和浮点数是正确的,但不是十进制的,是的,确实是这样(我承认,只是我真的试过了)。我知道
decimal
在其表示形式上比浮点类型更为特殊,但我并不怀疑这种差异到目前为止是合理的。感谢您的提示,现在修复了答案。请记住,
decimal
也是浮点类型。只是它是一种浮点小数类型,而不是浮点二进制类型。
double v2 = 1.000;
String.Format("{0:0.0000}", v1); // outputs 1.0000
String.Format("{0:0.0000}", v2); // outputs 1.0000 too