0

mschartのy軸の最大値と最小値の設定に問題があります。maxまたはminを値、たとえば10.025に設定する場合、チャートがmaxとして設定する値は10.024999618530273です。

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

GetRoundYAxisMaxメソッドは、「ラウンド」値を返すだけです。以下のコード。

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

0

なぜ10.025ではなく10.024999618530273なのか答えてください。コンピューター上に無限の精度があるものはありません。あなたの番号を表すために( IIRC )80ビットがあります。一部は指数部、仮数部です。何が起こっているかというと、10.025 はそのビット数で完全に表現できる数値ではないということです。数直線全体が得られるわけではなく、それに沿って積分記号が得られます。(ランダムな 80 ビット double を取得します。これは数直線上の点です。次に、その 80 ビット double に可能な限り最小の増分を追加します。線上の別の点。今度は、「実際の」(しゃれが意図された) 世界で, 無限数の実点があります. 実世界の数直線上で表そうとする線上の任意の点は、80 ビット世界でその点を結ぶ 2 つの点のうちの 1 つとして表されます )。

于 2014-06-15T08:08:18.830 に答える