Кратные 10,100,1000, ... C#

Я хочу, чтобы целое число было кратно 10,100,1000 и так далее...

для, например, double val = 35, тогда я хочу int 40
val = 357 тогда я хочу int val = 400
val = 245,567 тогда я хочу int val = 300,000
val = 245,567.986 тогда также я хочу int = 300,000

есть ли что-нибудь в C#, что может помочь в создании этих целых

основная логика, которую я могу думать: извлеките первое целое число, добавьте к нему 1. Подсчитайте общее количество цифр и добавьте нули (totalno -1 ).

есть ли лучший способ ?

Я хочу присвоить эти значения оси диаграммы. Я пытаюсь динамически создавать значения меток оси на основе точек данных диаграмм.

4 ответов


это должно делать то, что вы хотите, где X-входной сигнал:

        double scale = Math.Pow(10, (int)Math.Log10(x));
        int val = (int)(Math.Ceiling(x / scale) * scale);

выход:

 35          40
 357         400
 245567      300000
 245567.986  300000

если вы хотите, чтобы он справлялся с отрицательными числами (предполагая, что вы хотите округлить от 0):

        double scale = (x == 0 ? 1.0 : Math.Pow(10, (int)Math.Log10(Math.Abs(x))));
        int val = (int)(Math.Ceiling(Math.Abs(x) / scale) * scale)*  Math.Sign(x);

что дает:

-35         -40
 0           0
 35          40
 357         400
 245567      300000
 245567.986  300000

этот подход должен работать как для положительных, так и для отрицательных значений x:

int log = (x == 0) ? 1 : (int)(Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(x)))));
int result = (int)(((x < 0) ? Math.Floor(x / log) : Math.Ceiling(x / log)) * log);

не могу c#-конкретный ответ, но вообще то, что вы ищете-это log10, как бы это ни называлось в c#. Если хотите оперировать по номеру.

Если речь идет о выходе, вы можете, действительно, работать со строкой, пропуская / регулируя первое число и т. д.


Это должно к трюку:

// val is the value
var log = Math.Floor(Math.Log10(val));
var multiplier = Math.Pow(10, log);

var result = Math.Ceiling(val/multiplier)*multiplier;