Ребята, я делаю простой графический ящик и хочу найти красивые значения для горизонтальных линий. Например, если у меня есть значение равное 72089.601562, красивое 70000, или 75000. Так что, я думаю, что beautifulNumber% 5 = 0. У вас есть идеи?Round to "beautiful" value
ответ
Как насчет этого?
#import <math.h>
#import <stdio.h>
#define ROUNDING 5000
int beautify(float input)
{
// Cast to int, losing the decimal value.
int value = (int)input;
value = (value/ROUNDING) * ROUNDING;
if ((int)input % ROUNDING > ROUNDING/2)
{
value += ROUNDING;
}
return value;
}
int main()
{
printf("%d\n", beautify(70000.601562)); // 70000
printf("%d\n", beautify(72089.601562)); // 70000
printf("%d\n", beautify(76089.601562)); // 75000
printf("%d\n", beautify(79089.601562)); // 80000
printf("%d\n", beautify(70000.601562)); // 70000
return 0;
}
это объектив-c?) – werbary
Да. Функция 'beatify' является простой C, которую вы можете использовать в своем проекте Objective-C. Помните, что Objective-C - это просто C с некоторыми дополнениями. Если вы хотите, вы можете превратить его в метод Obj-C, но на самом деле нет необходимости. Вы можете сохранить его как функцию C, просто поместите его вне своего класса. – Joe
Я попробую, спасибо. – werbary
Это зависит от того, хотите ли вы значение пола, значение потолка или просто округлять до ближайшего 5000.
Для значения пола:
int beautiful = (int)(floor(ugly/5000.0) * 5000.0);
Для значения потолка:
int beautiful = (int)(ceil(ugly/5000.0) * 5000.0);
Для округления:
int beautiful = (int)(round(ugly/5000.0) * 5000.0);
Для создания графика линий, я бы, вероятно, найти минимальное и максимальное значения, вы должны график, начните со значением пола для минимального значения, а затем добавьте нужный интервал, пока не превысили максимальную величину ,
Например:
float minValue = 2.34;
float maxValue = 7.72;
int interval = 1;
NSMutableArray *horizLines = [NSMutableArray array];
int line = (int)(floor(minValue/interval) * interval);
[horizLines addObject:[NSNumber numberWithInt:line]];
do {
line = (int)(ceil(minValue/interval) * interval);
[horizLines addObject:[NSNumber numberWithInt:line]];
if (minValue >= maxValue) break;
minValue = minValue + interval;
}
использовать по мере необходимости!
Ну, похоже, вы хотите, чтобы он масштабировался в зависимости от размера номера. Если диапазон достигает 10, то, очевидно, округление до ближайших 5000 не имеет смысла. Там, наверное, действительно элегантный способ кодировать его, используя немного сдвигая, но только что-то вроде этого будет делать трюк:
float value = 72089.601562
int beautiful = 0;
// EDIT to support returning a float for small numbers:
if (value < 0.2) beautiful = int(value*100)/100.;
else if (value < 2.) beautiful = int(value*10)/10.;
// Anything bigger is easy:
else if (value < 20) beautiful = (int)value;
else if (value < 200) beautiful = (int)value/10;
else if (value < 2000) beautiful = (int)value/100;
else if (value < 20000) beautiful = (int)value/1000;
// etc
он возвращает полное число, но он должен быть делимым на 5, и ваш метод не работает для очень маленьких чисел. Например: 0.042. Красиво для него: 0.05 – werbary
Это довольно тривиально расширить алгоритм для меньших значений ... – buildsucceeded
да, но он возвращает только полное значение. Это не моя цель. – werbary
Похоже, что вы хотите сделать, это круглый 1 или, возможно, 2 значащих цифр. Округление до п значащих цифр довольно легко:
double roundToNDigits(double x, int n) {
double basis = pow(10.0, floor(log10(x)) - (n-1));
return basis * round(x/basis);
}
Это даст вам roundToNDigits(74518.7, 1) == 70000.0
и roundToNDigits(7628.54, 1) == 8000.00
Если вы хотите, чтобы округлить до 1 или 2 цифр (только 2, где вторая цифра 5), вы хотите что-то вроде:
double roundSpecial(double x) {
double basis = pow(10.0, floor(log10(x)))/2.0;
return basis * round(x/basis);
}
Aw man ... ты сделал это умным способом. – buildsucceeded
- 1. PHP round() 0.50 to lower value
- 2. Round up BigDecimal to Integer value
- 3. iPhone: round double value
- 4. Java, Round double to two decimal (round to 0.05)
- 5. PHP round to integer
- 6. swith to round list to shift easy
- 7. Round to places to 0 C#
- 8. Round a float value in Ruby
- 9. Установить значение floor/round value sql
- 10. jQuery pass to value value
- 11. TSQL round to half decimals
- 12. Round Output to whole Number
- 13. PHP round to precision 2
- 14. zoo - Round coredata to integer
- 15. Php Round - aprox to decimals
- 16. unix timestamp round to midnight
- 17. Round double to top - C#
- 18. Golang: time.Time Round to Day
- 19. Golang Round to Nearest 0.05
- 20. Pythonic way to "round()" как Javascript "Math.round()"?
- 21. Round Double and Cast to String
- 22. Rewrite & sub = value to/value .htaccess
- 23. Hex to int32-Value
- 24. Xamarin.Forms.Color to hex value
- 25. string to hex value
- 26. XML to String value
- 27. C# Math Round -11.5 to 11 и round -11.6 to 12
- 28. Round float to closer (или ближайший)
- 29. Round float to 2 decimals javascript
- 30. Round float to floats in array
вы хотите округлить до ближайшей 5 000-й? –
Methinks [NSNumberFormatter] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Fou...) будет работать. – CodaFi
Округление должно быть динамическим. Например, 7 следует преобразовать в 10. – werbary