请考虑以下代码:
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)
为什么会出现这些不准确之处?
考虑下面的四个百分比,表示为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).
如何检查float变量是否包含整数值?到目前为止,我一直在使用:
float f = 4.5886;
if (f-(int)f == 0)
printf("yes\n");
else printf("no\n");
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的解决方案,或者这个解决方案是否存在任何(或许多)缺点.
在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.
我试图在每个时间戳找到数据框中的列名,其值与同一时间戳的时间序列中的列匹配.
这是我的数据帧:
>>> 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) 我有以下数据帧:
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
我有一段代码的行为不同,这取决于我是否通过字典获取转换因子或我是否直接使用它们.
将打印以下代码 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) 显然浮动比较总是很棘手.我在我的(科学)代码中有很多断言检查,所以我经常要检查总和是否相等,以及类似的问题.
是否有快速简便/最佳实践方式来执行这些检查?
我能想到的最简单的方法是为固定容差浮点数比较建立一个自定义函数,但这对我来说似乎很难看.我更喜欢内置的解决方案,或者至少是非常清晰和易于理解的东西.
感谢您的输入!
我试图断言两个词典几乎是平等的,但我似乎无法做到这一点.
这是一个例子:
>>> 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中两个数字的通用方法.特别是,我想弄清楚它们是否相同.
Python中的数字类型是:
int, long, float & complex
Run Code Online (Sandbox Code Playgroud)
例如,我可以简单地说:2比较2个整数(一种数字):
a == b
Run Code Online (Sandbox Code Playgroud)
对于浮子,由于舍入精度,我们必须更加小心,但我可以在一定容差范围内对它们进行比较.
题
我们得到2个一般数字a和b:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是,那么它将具有0个虚部int)并在该域中进行比较?
这个问题比直接比较浮点数更普遍.当然,它与这个问题有关,但它不一样.