如何将双精度数的小数位转换为字符串?
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
这表明变量 a
和 c
比较相等,即它们持有 完全相同的 相同的值,但其中一个是用 1 个小数位定义的而另一个有 17 个十进制数字。要点是,谈论与浮点数 value 相关联的小数位数是没有意义的,因为如本例所示,相同的值可以有不同的表示形式小数位..
作为旁注,上面还表明 b
和 c
是不同的值,即使它们仅在小数点后第 17 位不同。这与double
类型具有between 15 and 17个有效小数位是一致的,这就是为什么一般不能忽略第16和第17位的原因。
我有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
这表明变量 a
和 c
比较相等,即它们持有 完全相同的 相同的值,但其中一个是用 1 个小数位定义的而另一个有 17 个十进制数字。要点是,谈论与浮点数 value 相关联的小数位数是没有意义的,因为如本例所示,相同的值可以有不同的表示形式小数位..
作为旁注,上面还表明 b
和 c
是不同的值,即使它们仅在小数点后第 17 位不同。这与double
类型具有between 15 and 17个有效小数位是一致的,这就是为什么一般不能忽略第16和第17位的原因。