如何将双精度数的小数位转换为字符串?

How do I covert the decimal places of a double to a string?

我有4个例子:

double a = 1.05;
double b = 0.000056;
double c = 0.7812;
double d = 1.2;

我要做的是先求出有多少个位值。 在这种情况下

int inta = 2;
int intb = 6;
int intc = 4;
int intd = 1;

然后我想创建一个字符串,其中“0”代表这些数字。这是一个 ToString()

string stra = ".00";
string strb = ".000000";
string strc = ".0000";
string strd = ".0";

所以我唯一拥有的就是双人间。我需要位值,然后如何创建字符串。

双打不能准确表示所有以 10 为底的分数。相反,您应该使用小数类型。

decimal a = 1.05;
decimal b = 0.000056;
decimal c = 0.7812;
decimal d = 1.2;
decimal e = 1.456000;

a.ToString() == "1.05"
b.ToString() == "0.000056"
c.ToString() == "0.7812"
d.ToString() == "1.2"
e.ToString() == "1.456000"

public static decimal Normalise(this decimal value) => value / 1.000000000000000000000000000000000m;

e.Normalise().ToString() == "1.456"

您可以将双精度数转换为字符串,然后获取子字符串:

double a = 1.05;

// Convert to string
string aString = a.ToString();

// Get substring
string result = aString.Substring(aString.LastIndexOf('.'));

// Get number of decimals
int numDecimals = result.Length - 1;

// Create string based on decimal count
string zeroString = ".";
for (int i = 0; i < numDecimals; i++) {
   zeroString += "0";
}

Console.WriteLine(result);
Console.WriteLine(numDecimals);
Console.WriteLine(zeroString);
// .05
// 2
// .00

** 确保这适用于所有文化,而不仅仅是那些使用“.”的人。作为小数点分隔符,您可以替换:

LastIndexOf('.')

LastIndexOf(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator)

(感谢@John)

我认为问题不成立。具体来说,这部分:

first find how many [decimal] place values there are

小数位数是表示形式的问题,而不是数字的固有 属性。当写入 double a = 0.3; 时,存储到变量 a 中的是最接近精确小数 0.3 的双精度值。该值接近 0.3,但不等同于 0.3,因为 IEEE-754 是基于二进制的,而 0.3 是一个不终止的二进制小数。但是,一旦分配,变量 a 就没有记忆它来自哪里,或者源代码是否将它作为 double a = 0.3;double a = 0.29999999999999999;.

考虑以下片段:

double a = 0.3;
double b = 0.2999999999999999;
double c = 0.29999999999999999;
Console.WriteLine("a = {0}, b = {1}, c = {2}, a==b = {3}, b==c = {4}, a==c = {5}", a, b, c, a==b, b==c, a==c);

输出为:

a = 0.3, b = 0.3, c = 0.3, a==b = False, b==c = False, a==c = True

这表明变量 ac 比较相等,即它们持有 完全相同的 相同的值,但其中一个是用 1 个小数位定义的而另一个有 17 个十进制数字。要点是,谈论与浮点数 value 相关联的小数位数是没有意义的,因为如本例所示,相同的值可以有不同的表示形式小数位..

作为旁注,上面还表明 bc 是不同的值,即使它们仅在小数点后第 17 位不同。这与double类型具有between 15 and 17个有效小数位是一致的,这就是为什么一般不能忽略第16和第17位的原因。