我有一些理解问题,c#中的百分比计算
为什么这样做。
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
self.stop_requested = threading.Event()
self.exception = None
def run(self):
try:
# sleep for 1 second, or until stop is requested, stop if stop is requested
while not self.stop_requested.wait(1):
# do your thread thing here
print('in thread {}'.format(self))
# simulate a random exception:
import random
if random.randint(0, 50) == 42:
1 / 0
except Exception as e:
self.exception = e
# clean up here
print('clean up thread {}'.format(self))
def stop(self):
# set the event to signal stop
self.stop_requested.set()
# create and start some threads
threads = [MyThread(), MyThread(), MyThread(), MyThread()]
for t in threads:
t.start()
# main thread looks at the status of all threads
try:
while True:
for t in threads:
if t.exception:
# there was an error in a thread - raise it in main thread too
# this will stop the loop
raise t.exception
time.sleep(0.2)
except Exception as e:
# handle exceptions any way you like, or don't
# This includes exceptions in main thread as well as those in other threads
# (because of "raise t.exception" above)
print(e)
finally:
print('clan up everything')
for t in threads:
# threads will know how to clean up when stopped
t.stop()
而这不是......
100 * usedDiskSpace/maxDiskSpace
我没理解。
为什么?
以获得更好的解释。我尝试计算硬盘卷的百分比。我编写了其他语言,如Actionscript或php,或JAVA。我不明白,为什么较低计算的结果将导致0值。
答案 0 :(得分:5)
您的操作顺序不同。
您的第一个示例100 * usedDiskSpace/maxDiskSpace
与(100*usedDiskSpace)/maxDiskSpace
相同。
你的第二个例子,(usedDiskSpace/maxDiskSpace)*100
在乘法之前进行除法。在整数除法中,整数后的任何内容都会被截断。由于(推测)maxDiskSpace总是大于usedDiskSpace,因此结果将为0 * 100或0。
为了举个例子,我们可以通过一些玩具编号解决这个问题。
int a = 10;
int b = 20;
Console.WriteLine(100*a/b); // Output: 50
// 100*10/20
// (100*10)/20
// 1000/20
// 50
Console.WriteLine((a/b)*100); // Output: 0
// (10/20)*100
// (0)*100 <- 0, rather than 0.5 due to how integer division works
// 0
答案 1 :(得分:3)
整数部门和运营顺序
当你分割两个整数时,你会得到一个整数结果。假设您有值40
和50
。当你拥有的只是整数时,40/50
只是0
。在整数土地中没有.8
这样的东西。即使您还乘以100
,分组也已经发生,100*0
仍然是0
。
但如果您将分子乘以100
首先,则得到4000/50
。这仍然留下了整数结果的空间:80
。
这是发生在这里的事情。第一个示例首先执行乘法。第二个例子首先执行除法。
答案 2 :(得分:2)
问题可能是由integer division造成的。
如果您要查找整数的结果(例如10%
),其他答案都很棒。如果您要查找具有多个小数点的结果(例如10.57%
),请考虑使用:
var bob = ((usedDiskSpace * 1.0 / maxDiskSpace) * 100);
甚至更简单:
var bob = usedDiskSpace * 100.0 / maxDiskSpace;
乘以1.0
(或100.0
)将确保整数除法不使用(因为1.0
和100.0
为{{1} }}
答案 3 :(得分:1)
在数学演算中,括号的排列是决定性的。在以下表达式中:
100 * usedDiskSpace / maxDiskSpace
首先 100 乘以 usedDiskSpace ,然后再划分为 maxDiskSpace 。例如:
100 * 50/20 = 5000/20 = 250
但在第二个计算中,计算如下:
((usedDiskSpace / maxDiskSpace)* 100)
首先 usedDiskSpace 分为 maxDiskSpace ,然后乘以 100 。此方案中的上一个示例的行为如下:
((50/20)* 100)= 2 * 100 = 200
请注意,如果 usedDiskSpace 和 maxDiskSpace 变量是整数类型,那么除法结果将是整数:
50/20 = 2(不是2.5)
要在您提到的表达式中获得相同的结果,您应该将 usedDiskSpace 和 maxDiskSpace 变量定义为float或double类型。
答案 4 :(得分:1)
这是因为你进行了整数除法。只需转换为float
或double
即可获得所需的结果。
int usedDiskSpace = 230, maxDiskSpace = 980;
// integer division
int res = 100 * usedDiskSpace / maxDiskSpace;
// 23
res = ((usedDiskSpace / maxDiskSpace) * 100);
// 0
// floating point division
float resF =100f * usedDiskSpace / maxDiskSpace;
// 23.4693871
resF = (((float)usedDiskSpace / maxDiskSpace) * 100);
// 23.4693871