注意:在提交问题之前,我想说我已经在我自己和其他问题上找到了解决方案,但我找到的解决方案并不合适我的需要。
我正在使用的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 这个词甚至没有开始描述这个......
答案 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。
很快:之前的时间较长。 =精度较低。