Tag: 浮点

Microsoft ACE驱动程序在我的程序的其余部分更改了浮点精度

在使用Microsoft ACE驱动程序打开Excel电子表格之后,我遇到了某些计算结果更改的问题。 下面的代码重现了这个问题。 前两个DoCalculation调用产生相同的结果。 然后我调用OpenSpreadSheet函数,它使用ACE驱动程序打开和closuresExcel 2003电子表格。 您不希望OpenSpreadSheet对最后一次调用OpenSpreadSheet有任何影响,但事实certificate结果实际上发生了变化。 这是程序生成的输出: 1,59142713593566 1,59142713593566 1,59142713593495 请注意最近3位小数的差异。 这似乎没有什么太大的差别,但是在我们的生产代码中,计算是复杂的,所得到的差异是相当大的。 如果我使用JET驱动程序而不是ACE驱动程序,则没有区别。 如果我将types从double改为decimal,错误就会消失。 但是在我们的生产代码中这不是一个选项。 我在Windows 7 64位上运行,程序集是为.NET 4.5 x86编译的。 我们正在运行32位Office,因此使用64位ACE驱动程序不是一个选项。 有谁知道为什么会发生这种情况,我该如何解决? 以下代码重现了我的问题: static void Main(string[] args) { DoCalculation(); DoCalculation(); OpenSpreadSheet(); DoCalculation(); } static void DoCalculation() { // Multiply two randomly chosen number 10.000 times. var d1 = 1.0003123132; var d3 = 0.999734234; double […]

即使Excel不精确,Excel如何成功地轮询浮动数字?

例如, 这个博客说0.005不是完全是0.005,而是四舍五入得出正确的结果。 我在我的C ++中尝试了各种Round,并且我没有将舍入数字舍去到某些小数位。 例如,Round(x,y)将x舍入为y的倍数。 所以轮(37.785,0.01)应该给你37.79而不是37.78。 我正在重新提出这个问题,要求社区寻求帮助。 问题在于浮点数的不精确性(37,785表示为37.78499999999)。 问题是Excel如何解决这个问题? 在这一轮的解决scheme()在C + +的浮动是不正确的上述问题。

将Python Float转换为string而不会丢失精度

我正在维护一个Python脚本,它使用xlrd从Excel电子表格中检索值,然后用它们做各种事情。 电子表格中的一些单元格是高精度数字,它们必须保持原样。 当检索其中一个单元格的值时, xlrd给了我一个float例如0.38288746115497402。 但是,我需要在代码中稍后将此值转换为string。 做任何str(value)或unicode(value)将返回类似“0.382887461155”。 要求说这是不可接受的; 精度需要保留。 到目前为止,我已经尝试了几件事情,但没有成功。 第一个是使用string格式化的东西: data = "%.40s" % (value) data2 = "%.40r" % (value) 但是两者都产生相同的舍入数字“0.382887461155”。 在search到与在SO和其他地方在互联网上类似问题的人,一个共同的build议是使用Decimal类。 但是我不能改变数据给我的方式(除非有人知道让xlrd返回小数的秘密方法)。 当我尝试这样做时: data = Decimal(value) 我得到一个TypeError: Cannot convert float to Decimal. First convert the float to a string. TypeError: Cannot convert float to Decimal. First convert the float to a string. 但显然我不能将其转换为string,否则我将失去精度。 所以是的,我愿意提供任何build议 […]