C#中的小数加倍到小数点后6位

时间:2017-05-25 12:58:20

标签: c# double rounding

注意:在提交问题之前,我想说我已经在我自己和其他问题上找到了解决方案,但我找到的解决方案并不合适我的需要。

我正在使用的API返回带有7个小数位的 double ,例如:1495120024.7705889

但是我需要打印这个(或返回一个字符串): 1495120024.770589 - 基本上四舍五入到小数点后六位。

最初看起来像是一件微不足道的事情,结果是变得精神崩溃。

这些是我尝试过的方法(假设上面的值存储在一个名为 d 的double中):

d.ToString() = 1495120024.77059

d.ToString("F6") = 1495120024.770590

d.ToString("F7") = 1495120024.7705900

Math.Round(d, 6) = 1495120024.7705891 - [舍入错误?]

Math.Truncate(d * 1000000) / 1000000 = 1495120024.7705879

Convert.ToDecimal(Math.Truncate(d * 1000000)) = 1495120024770590

Convert.ToDecimal(d) = 1495120024.77059

我知道这听起来很傻,但我需要将它四舍五入到小数点后六位并正确设置为字符串。我也知道在双精度中舍入错误,但遗憾的是我无法控制API返回的数据类型。

编辑v1:

基于BWA的评论,这是我提出的解决方案:

var s = Math.Round(d - Math.Truncate(d), 6).ToString(); s = s.Substring(s.IndexOf(".") + 1); s = $"{Math.Truncate(d)}.{s}";

hack 这个词甚至没有开始描述这个......

1 个答案:

答案 0 :(得分:0)

double d = 256.7705889;
Console.WriteLine(d.ToString("F6"));

写入

  

256.770589

但是

double d = 1121111156.7705889;
Console.WriteLine(d.ToString("F6"));

写入:

1121111156.770590

问题是双重的运作方式。更多here

很快:之前的时间较长。 =精度较低。