показывать большие числа (двойное значение) на круговой диаграмме с помощью MpAndroidChart - PullRequest
0 голосов
/ 17 ноября 2018

Я использую круговую диаграмму в своей деятельности. Когда я устанавливаю большое значение в записи, оно не показывает правильное значение.

Например:

Мое значение равно 627050000 , но на графике показано: 627049986 ,

или

Мое значение равно 477470000 , но на графике указано: 477470016 .

Вот мой код

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    double num1 = 627050000 ;
    double num2 = 477470000 ;

    setupPieChart();
}

private void setupPieChart() {

    List<PieEntry> pieEntries = new ArrayList<>();

    pieEntries.add(new PieEntry((float) num1 , "num1"));
    pieEntries.add(new PieEntry((float) num2 , "num2"));

    PieDataSet dataSet = new PieDataSet(pieEntries , "numbers");

    PieData data = new PieData(dataSet);
    PieChart pieChart = (PieChart) findViewById(R.id.piechart);
    pieChart.setTransparentCircleAlpha(1);
    pieChart.getDescription().setEnabled(false);

    //add legend to chart

    Legend legend = pieChart.getLegend();
    legend.setForm(Legend.LegendForm.CIRCLE);
    legend.setOrientation(Legend.LegendOrientation.VERTICAL);
    legend.setDirection(Legend.LegendDirection.RIGHT_TO_LEFT);
    legend.setPosition(Legend.LegendPosition.RIGHT_OF_CHART);

    //add colors to dataset

    ArrayList<Integer> colors = new ArrayList<>();
    colors.add(Color.CYAN);
    colors.add(Color.GREEN);
    colors.add(Color.RED);

    dataSet.setColors(colors);

    pieChart.setData(data);
    pieChart.animateY(1000);
    pieChart.invalidate();
}

Я читал о ValueFormatter классе, также используя BigDecimal, но я не понял. Пожалуйста, помогите и объясните простым способом.

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2018

Это происходит потому, что вы конвертируете двойные числа в число с плавающей точкой. MPAndroidChart нарисует запись со значением с плавающей точкой. Вы определяете double num1 = 627050000;, но сохраняете его как new PieEntry((float) num1 , "num1")

Обратите внимание, что:

float: тип данных float - 32-битный IEEE 754 с одинарной точностью с плавающей запятой .... используйте float (вместо double), если вам нужно сохранить память в больших массивах чисел с плавающей точкой. Этот тип данных никогда не следует использовать для точных значений, таких как валюта. Для этого, вам нужно будет использовать класс java.math.BigDecimal вместо

double: тип данных double - 64-битный IEEE 754 с двойной точностью плавающая запятая. Для десятичных значений этот тип данных обычно выбор по умолчанию. Как упоминалось выше, этот тип данных никогда не должен быть используется для точных значений, таких как валюта.

( источник )

В вышеупомянутой конверсии вы теряете в точности числа. Определите ваши значения как float вместо double

...