相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

如何使舍入百分比加起来达到100%

考虑下面的四个百分比,表示为float数字:

    13.626332%
    47.989636%
     9.596008%
    28.788024%
   -----------
   100.000000%
Run Code Online (Sandbox Code Playgroud)

我需要将这些百分比表示为整数.如果我只是使用Math.round(),我最终总共有101%.

14 + 48 + 10 + 29 = 101
Run Code Online (Sandbox Code Playgroud)

如果我使用parseInt(),我最终总共有97%.

13 + 47 + 9 + 28 = 97
Run Code Online (Sandbox Code Playgroud)

什么是一个很好的算法来表示任意数量的百分比作为整数,同时仍然保持总计100%?


编辑:在阅读了一些评论和答案后,显然有很多方法可以解决这个问题.

在我看来,为了忠实于数字,"正确"的结果是最小化整体错误的结果,由相对于实际值引入的错误舍入量来定义:

        value  rounded     error               decision
   ----------------------------------------------------
    13.626332       14      2.7%          round up (14)
    47.989636       48      0.0%          round up (48)
     9.596008       10      4.0%    don't round up  (9)
    28.788024       29      2.7%          round up (29)
Run Code Online (Sandbox Code Playgroud)

在平局(3.33,3.33,3.33)的情况下,可以做出任意决定(例如3,4,3).

algorithm math rounding percentage

173
推荐指数
7
解决办法
8万
查看次数

检查float是否为整数

如何检查float变量是否包含整数值?到目前为止,我一直在使用:

float f = 4.5886;
if (f-(int)f == 0)
     printf("yes\n");
else printf("no\n");
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的解决方案,或者这个解决方案是否存在任何(或许多)缺点.

c floating-point int

65
推荐指数
5
解决办法
9万
查看次数

检查float是否等于python中的整数值

在Python 3中,我正在检查给定值是否为三角形,也就是说,对于某些正整数n,它可以表示为n(n + 1)/ 2

我可以写一下:

import math
def is_triangular1(x):
    num=(1/2) * (math.sqrt(8*x+1)-1 )
    return int(num)==num
Run Code Online (Sandbox Code Playgroud)

或者我需要这样做吗?:

epsilon = 0.000000000001
def is_triangular2(x):
    num=(1/2) * (math.sqrt(8*x+1)-1 )
    return abs(int(num) - num)<epsilon
Run Code Online (Sandbox Code Playgroud)

我检查了两个函数返回x的相同结果,最多为1,000,000.但我不确定一般来说int(x)== x将始终正确地确定一个数是否是整数,因为例如5的情况表示为4.99999999999997等.

据我所知,第二种方法是正确的,如果我用C语言,但我不确定Python 3.

python floating-point

22
推荐指数
4
解决办法
2万
查看次数

获取列名称,其中value是pandas dataframe中的值

我试图在每个时间戳找到数据框中的列名,其值与同一时间戳的时间序列中的列匹配.

这是我的数据帧:

>>> df
                            col5        col4        col3        col2        col1
1979-01-01 00:00:00  1181.220328  912.154923  648.848635  390.986156  138.185861
1979-01-01 06:00:00  1190.724461  920.767974  657.099560  399.395338  147.761352
1979-01-01 12:00:00  1193.414510  918.121482  648.558837  384.632475  126.254342
1979-01-01 18:00:00  1171.670276  897.585930  629.201469  366.652033  109.545607
1979-01-02 00:00:00  1168.892579  900.375126  638.377583  382.584568  132.998706

>>> df.to_dict()
{'col4': {<Timestamp: 1979-01-01 06:00:00>: 920.76797370744271, <Timestamp: 1979-01-01 00:00:00>: 912.15492332839756, <Timestamp: 1979-01-01 18:00:00>: 897.58592995700656, <Timestamp: 1979-01-01 12:00:00>: 918.1214819496729}, 'col5': {<Timestamp: 1979-01-01 06:00:00>: 1190.7244605667831, <Timestamp: 1979-01-01 00:00:00>: 1181.2203275146587, <Timestamp: 1979-01-01 18:00:00>: 1171.6702763228691, <Timestamp: 1979-01-01 12:00:00>: 1193.4145103184442}, …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

18
推荐指数
4
解决办法
3万
查看次数

比较熊猫专栏中的花车

我有以下数据帧:

       actual_credit    min_required_credit
   0   0.3              0.4
   1   0.5              0.2
   2   0.4              0.4
   3   0.2              0.3
Run Code Online (Sandbox Code Playgroud)

我需要添加一个列,指示actual_credit> = min_required_credit的位置.结果将是:

       actual_credit    min_required_credit   result
   0   0.3              0.4                   False
   1   0.5              0.2                   True
   2   0.4              0.4                   True
   3   0.1              0.3                   False
Run Code Online (Sandbox Code Playgroud)

我正在做以下事情:

df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])
Run Code Online (Sandbox Code Playgroud)

但是第3行(0.4和0.4)经常导致False.在各个地方研究这个问题后,包括:在Python中比较浮点数几乎相等的最佳方法是什么?我仍然无法让这个工作.只要两列具有相同的值,结果就是False,这是不正确的.

我正在使用python 3.3

python pandas

18
推荐指数
2
解决办法
1万
查看次数

Python中的浮点相等

我有一段代码的行为不同,这取决于我是否通过字典获取转换因子或我是否直接使用它们.

将打印以下代码 1.0 == 1.0 -> False

但是,如果你更换factors[units_from]10.0,并factors[units_to ]1.0 / 2.54它将打印1.0 == 1.0 -> True

#!/usr/bin/env python

base = 'cm'
factors = {
    'cm'        : 1.0,
    'mm'        : 10.0,
    'm'         : 0.01,
    'km'        : 1.0e-5,
    'in'        : 1.0 / 2.54,
    'ft'        : 1.0 / 2.54 / 12.0,
    'yd'        : 1.0 / 2.54 / 12.0 / 3.0,
    'mile'      : 1.0 / 2.54 / 12.0 / 5280,
    'lightyear' : 1.0 / 2.54 / …
Run Code Online (Sandbox Code Playgroud)

python floating-point equality

16
推荐指数
3
解决办法
2万
查看次数

Matlab中浮点数比较的最佳实践

显然浮动比较总是很棘手.我在我的(科学)代码中有很多断言检查,所以我经常要检查总和是否相等,以及类似的问题.

是否有快速简便/最佳实践方式来执行这些检查?


我能想到的最简单的方法是为固定容差浮点数比较建立一个自定义函数,但这对我来说似乎很难看.我更喜欢内置的解决方案,或者至少是非常清晰和易于理解的东西.

感谢您的输入!

floating-point matlab

14
推荐指数
3
解决办法
4044
查看次数

断言两个词典几乎相同

我试图断言两个词典几乎是平等的,但我似乎无法做到这一点.

这是一个例子:

>>> import nose.tools as nt
>>> nt.assert_dict_equal({'a' : 12.4}, {'a' : 5.6 + 6.8})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/unittest/case.py", line 838, in assertDictEqual
    self.fail(self._formatMessage(msg, standardMsg))
  File "/usr/lib/python2.7/unittest/case.py", line 413, in fail
    raise self.failureException(msg)
AssertionError: {'a': 12.4} != {'a': 12.399999999999999}
- {'a': 12.4}
+ {'a': 12.399999999999999}
Run Code Online (Sandbox Code Playgroud)

我希望这会通过,就像那样:

>>> nt.assert_almost_equal(12.4, 5.6 + 6.8)
Run Code Online (Sandbox Code Playgroud)

我希望我遗漏一些简单的东西nt.assert_almost_dict_equal,或者也许我可以传递的参数nt.assert_dict_equal指定浮点数应该有多近,但我找不到任何东西.

当然,我可以循环遍历字典并使用nt.assert_almost_equal单独比较值; 但是,在我的情况下,字典更复杂,所以我希望避免这样.

断言两个字典几乎相等的最佳方法是什么?

python dictionary assert nose

12
推荐指数
1
解决办法
7420
查看次数

在Python中比较数字的一般方法

我一直在寻找一种比较Python中两个数字的通用方法.特别是,我想弄清楚它们是否相同.

Python中的数字类型是:

int, long, float & complex
Run Code Online (Sandbox Code Playgroud)

例如,我可以简单地说:2比较2个整数(一种数字):

a == b
Run Code Online (Sandbox Code Playgroud)

对于浮子,由于舍入精度,我们必须更加小心,但我可以在一定容差范围内对它们进行比较.

我们得到2个一般数字ab:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是,那么它将具有0个虚部int)并在该域中进行比较?

这个问题比直接比较浮点数更普遍.当然,它与这个问题有关,但它不一样.

python floating-point int type-conversion numerics

9
推荐指数
2
解决办法
1048
查看次数