当前位置:网站首页>计算饼状图百分比

计算饼状图百分比

2022-04-23 16:40:00 轻松的小希

需求描述:

给定一个整数数组,例如:[2, 3, 4],计算各个元素的百分比,要求百分比累加为100%。

input = [2, 3, 4]
output = [22.22, 33.33, 44.45]

项目依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

代码实现:

public class PercentUtils {
    
    /** * 计算饼状图百分比 * * @param arr * @param idx * @param precision * @return */
    public static double getPercentValue(int[] arr, int idx, int precision) {
    
        //判断索引
        if (idx < 0 || (arr.length - 1) < idx) {
    
            return 0;
        }
        //数组求和
        double sum = 0;
        for (int i = 0; i < arr.length; i++) {
    
            sum += arr[i];
        }
        if (sum <= 0) {
    
            return 0;
        }
        //计算精度
        double digits = Math.pow(10, precision);
        //扩大比例
        double[] votesPerQuota = new double[arr.length];
        for (int i = 0; i < arr.length; i++) {
    
            double val = arr[i] / sum * digits * 100;
            votesPerQuota[i] = val;
        }
        //扩大总数
        double targetSeats = digits * 100;
        //向下取值
        double[] seats = new double[arr.length];
        for (int i = 0; i < votesPerQuota.length; i++) {
    
            seats[i] = Math.floor(votesPerQuota[i]);
        }
        //重新累加
        double currentSum = 0;
        for (int i = 0; i < seats.length; i++) {
    
            currentSum += seats[i];
        }
        //余数数组
        double[] remainder = new double[arr.length];
        for (int i = 0; i < seats.length; i++) {
    
            remainder[i] = votesPerQuota[i] - seats[i];
        }
        //最大余数
        while (currentSum < targetSeats) {
    
            double max = Double.MIN_VALUE;
            int maxId = 0;
            for (int i = 0; i < remainder.length; ++i) {
    
                if (remainder[i] > max) {
    
                    max = remainder[i];
                    maxId = i;
                }
            }
            //对最大项余额加一
            ++seats[maxId];
            //这个余数已经使用
            remainder[maxId] = 0;
            //总数也要相应加一
            ++currentSum;
        }
        //返回占比
        return seats[idx] / digits;
    }
}

运行效果:

@SpringBootTest
public class TestPercentUtils {
    
    @Test
    public void testGetPercentValue01() {
    
        int[] arr = new int[]{
    2, 3, 4};
        for (int i = 0; i < arr.length; i++) {
    
            System.out.println(arr[i] + " percent = " + PercentUtils.getPercentValue(arr, i, 2));
        }
    }

    @Test
    public void testGetPercentValue02() {
    
        int[] arr = new int[]{
    2, 2, 2};
        for (int i = 0; i < arr.length; i++) {
    
            System.out.println(arr[i] + " percent = " + PercentUtils.getPercentValue(arr, i, 2));
        }
    }
}
2 percent = 22.22
3 percent = 33.33
4 percent = 44.45
2 percent = 33.34
2 percent = 33.33
2 percent = 33.33

版权声明
本文为[轻松的小希]所创,转载请带上原文链接,感谢
https://caochenlei.blog.csdn.net/article/details/124319584