Форматирование строки до 1 десятичного знака без округления вверх / вниз - PullRequest
2 голосов
/ 05 сентября 2011

Мне нужна функция, которой передается целое число, и если это целое число превышает определенное значение (1000 в моем текущем случае), я хочу выполнить некоторое деление, чтобы в конечном итоге я мог вернуть аббревиатуру исходного целого числа.

Например:

1000 = 1
1001 = 1
1099 = 1
1100 = 1.1
1199 = 1.1
1200 = 1.2
10000 = 10
10099 = 10
10100 = 10.1

Это разделение и округление вещей, которые вызывают у меня проблемы.

Какой метод был бы наиболее подходящим для получения результатов выше?

Ответы [ 8 ]

6 голосов
/ 05 сентября 2011

Как насчет:

int dividedBy100 = x / 100; // Deliberately an integer division
decimal dividedBy1000 = dividedBy100 / 10m; // Decimal division
string result = dividedBy1000.ToString();

Я бы посоветовал использовать здесь decimal вместо float или double, так как вы в основном хотите десятичное деление на 10.

0 голосов
/ 05 сентября 2011

Поскольку вы просто хотите урезать число, имеет смысл преобразовать его в строку, удалить последние два символа из строки, а затем разделить на 10, чтобы получить соответствующее число.

Вот алгоритм на Ruby.(У меня нет под рукой C #)

a = 1000 #sample number
 -> 1000

b = a.to_s[0..-3] #a converted to a string, then taking all characters except the last two.
 -> "10"

c = b.to_i / 10.0 # converts to float in correct power
 -> 1.0

Затем вы выводите «c» в любом формате, который вы хотите, используя sprintf (или эквивалент C #, используя FormatNumber).

0 голосов
/ 05 сентября 2011

Вы должны использовать модульную (остаточную) математику, чтобы сделать это. Вам не нужно задействовать FPU (модуль с плавающей запятой).

static string RoundAndToString(int value, int denominator)
{
    var remainder = value % denominator;
    value = (value - remainder) / denominator;
    if (remainder == 0)
        return value.ToString();
    remainder = (remainder * 10) / denominator;
    return string.Format("{0}{1}{2}", value, CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, remainder);
}
0 голосов
/ 05 сентября 2011

Ваши примеры, по-видимому, подразумевают, что вам нужен только один десятичный разряд точности, так как насчет чего-то вроде этого:

  1. Разделите на 100
  2. Приведите к двойному (или плавающему)
  3. Деление на 10

Первое деление усекает любые конечные числа меньше 100 (эквивалент функции 100-го этажа), затем приводит к удвоению и делению на 10дать вам единственное десятичное место точности, которое вы хотите.

0 голосов
/ 05 сентября 2011

1001 * попробовать *

int MyNumber = 10100;

string MyString = ((int) MyNumber/1000).ToString() + (( MyNumber % 1000) > 99 ? "." + (((int)( MyNumber / 100 )) % 10).ToString() : "");
0 голосов
/ 05 сентября 2011

Вот предложение

double function(int number)
{
    if (number >= 1000)
    {
       return (((double)number) / 1000);
    }

}
0 голосов
/ 05 сентября 2011

если t - исходное число, тогда

int a=t/100

float b=a/10

b должно содержать ваш ответ

Еще немного кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string s;
                s = Console.ReadLine();
                int a = Convert.ToInt32(s);
                a = a / 100;
                float b = a / (float)10.0;
                Console.WriteLine(b);
            }
        }
    }
}
0 голосов
/ 05 сентября 2011

Аббревиатура по определению округлена.

Если вам нужна более высокая точность, почему бы не использовать Double вместо Integer?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...