如何将双精度值转换为不带四舍五入的字符串
本文关键字:四舍五入 字符串 转换 双精度 | 更新日期: 2023-09-27 18:07:52
我有这样一个变量:
Double dou = 99.99;
我想把它转换成一个字符串变量,字符串应该是99.9
。
我可以这样做:
string str = String.Format("{0:0.#}", dou);
但是我得到的值是:100
而不是99.9
。
我怎么实现呢?
PS:这个问题被标记为重复。是的,他们可能有相同的解决方案(尽管我认为这是一个变通方法),但从不同的角度来看。
例如,如果有另一个变量:
Double dou2 = 99.9999999;
我想把它转换成字符串:99.999999
,那么我该怎么做?这样的:
Math.Truncate(1000000 * value) / 1000000;
但是如果点后面有更多的数字呢?
必须截断第二个小数点。
Double dou = 99.99;
double douOneDecimal = System.Math.Truncate (dou * 10) / 10;
string str = String.Format("{0:0.0}", douOneDecimal);
您可以使用Floor
方法进行舍入:
string str = (Math.Floor(dou * 10.0) / 10.0).ToString("0.0");
格式0.0
意味着即使它是零也会显示小数,例如99.09
被格式化为99.0
而不是99
。
更新:
如果你想根据输入中的位数动态地执行此操作,那么你首先必须决定如何确定输入中实际有多少位数字。
双精度浮点数不以十进制形式存储,而是以二进制形式存储。这意味着一些你认为只有几个数字的数字实际上有很多。您看到的数字1.1
的实际值可能是1.099999999999999945634
。
如果您选择使用将其格式化为字符串时显示的位数,那么您只需将其格式化为字符串并删除最后一位数字:
// format number into a string, make sure it uses period as decimal separator
string str = dou.ToString(CultureInfo.InvariantCulture);
// find the decimal separator
int index = str.IndexOf('.');
// check if there is a fractional part
if (index != -1) {
// check if there is at least two fractional digits
if (index < str.Length - 2) {
// remove last digit
str = str.Substring(0, str.Length - 1);
} else {
// remove decimal separator and the fractional digit
str = str.Substring(0, index);
}
}