如何将双精度值转换为不带四舍五入的字符串

本文关键字:四舍五入 字符串 转换 双精度 | 更新日期: 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);
  }
}