2015-01-15 58 views
0

我要圆得像25979.699999999997 15位值,因此它成为25979.7并且不包含任何无意义的零。如何将十进制值舍入到一个精度,以便总数位数不超过15?

背景: 我想解析一个使用OpenXML SDK的Excel文件,并且有十进制值,如25979.7读为25979.699999999997。

当MS excel显示值时,它总是将它们舍入到15位,并删除尾随的零,因此它变为25979.7,但是当我使用OpenXML SDK读取时,它不会自动执行此操作。

有什么想法?

编辑:其实我不想修改的值,只是想显示在该格式(作为一个字符串)。

+0

我认为'Double'将会有15位数字的精度另外''小数结构严格适用于需要准确性的财务计算,这是相对不容忍的四舍五入。“#: – MethodMan 2015-01-15 15:44:13

+1

确定你想**轮**即修改价值,或者只是**显示**在一个很好的格式? – DrKoch 2015-01-15 15:48:19

+1

他要求总共15位数,所以25979.699999999997 - > 25979.7000000000 - > 25979.7。 – 2015-01-15 15:48:26

回答

0

简单地格式化(未改性的)价值得到nicly格式化字符串:

double val = double.Parse("25979.699999999997"); 
string formatted = val.ToString("g"); 

g格式化会做所有的工作适合你。

+0

谢谢!这实际上有效!有一件事我仍然想要这样做,这会使我无法在代码中进行一些不受欢迎的更改,那样我就可以使用Decimal值进行解析,而不是使用Double?继回报25979.699999999997当我使用十进制: Decimal.Parse(“25979.699999999997”)的ToString(“G”) – Thunderstruck 2015-01-15 16:09:10

+0

嗯,@methodman提到,'decimal'实际上旨在保护precission,简化:它认为你想所有这些:...99997 – DrKoch 2015-01-15 16:11:37

+1

这只适用于'double'具有Thunderstruck想要的大致相同精度的事实。 – Rawling 2015-01-15 16:20:35

3

那么,你可以尝试不那么复杂的数学:

var x = 25979.699999999997; 
var y = Math.Round(x, 15 - (int)Math.Floor(Math.Log10(x) + 1)); 

y将完全25979.7

在这里,我们计算的位数小数点前为

Math.Floor(Math.Log10(x) + 1) 

和减去从15开始给我们剩余的小数位数。

+0

它看起来像OP使用'decimal'类型,在这种情况下舍入实际上将保留尾随零。 – Rawling 2015-01-15 15:57:26

+0

@Rawling不知道如果我理解正确的话,你 - 但我小数点可以在这里看到的唯一的问题 - 是'Math.Log10'有'double'作为论据的事实 - 是需要这么丑演员,但在这个特殊的这种情况下演员不是问题。 – 2015-01-15 16:06:16

+1

在给出的例子中,舍入小数的结果是'25979.7000000000'。小数点意识到它有多精确并保留尾随零。如果您在小数点上调用'ToString()',则默认打印这些零。 – Rawling 2015-01-15 16:21:35