0

我在为我的 mschart 的 y 轴设置最大值和最小值时遇到问题。将最大值或最小值设置为一个值(例如 10.025)时,图表设置为最大值的值为 10.024999618530273。

mainChart.ChartAreas[selectedChartArea].AxisY.Maximum = GetRoundYAxisMax(newYMax, newYRange);
mainChart.ChartAreas[selectedChartArea].AxisY.Minimum = GetRoundYAxisMin(newYMin, newYRange);

GetRoundYAxisMax 方法只返回一个“round”值。代码如下。

private float GetRoundYAxisMax(double calculatedMax, double yAxisRange)
        {
            double rangeFactor = 0;

            if (yAxisRange > 10)
                rangeFactor = 1;
            else if (yAxisRange > 1)
                rangeFactor = 4;
            else if (yAxisRange > 0.1)
                rangeFactor = 40;
            else if (yAxisRange > 0.01)
                rangeFactor = 400;
            else if (yAxisRange > 0.001)
                rangeFactor = 4000;
            else if (yAxisRange > 0.0001)
                rangeFactor = 40000;
            else
                rangeFactor = 400000;

            float returnValue = (float)(Math.Round(calculatedMax * rangeFactor, MidpointRounding.ToEven) / rangeFactor);
            return returnValue;
        }

舍入代码正确评估并返回正确舍入的值,但是当将此值设置为 y 轴上的最大值或最小值时,它会设置一个非常接近它的值,但未舍入。

任何想法为什么会发生这种情况?

4

2 回答 2

1

您可以将轴标签样式设置为舍入未舍入的值: mainChart.ChartAreas[selectedChartArea].AxisY.LabelStyle.Format = "#.###";

于 2013-04-17T12:12:19.700 回答
0

只是回答为什么是 10.024999618530273 而不是 10.025。计算机上没有什么是无限精确的。你有 (IIRC) 80 位来代表你的号码。部分是指数部分是尾数。正在发生的事情是 10.025 不是一个在该位数中具有完美表示的数字。你没有得到完整的数字线,你会沿着它得到整数标记。(取一个随机的 80 位双精度。这是数字轴上的一个点。现在,将最小的增量添加到可能的 80 位双精度。线上的另一个点。现在,在“真实”(双关语)世界中,有无数个实点。你试图在现实世界数线上表示的线上的任何点都将被表示为在 80 位世界中限制该点的两个点之一)。

于 2014-06-15T08:08:18.830 回答