c#百分比计算说明

时间:2018-06-07 00:42:18

标签: c# percentage

我有一些理解问题,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值。

5 个答案:

答案 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)

整数部门运营顺序

当你分割两个整数时,你会得到一个整数结果。假设您有值4050。当你拥有的只是整数时,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.0100.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)

这是因为你进行了整数除法。只需转换为floatdouble即可获得所需的结果。

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