2013-03-07 3 views
0

Это скорее вопрос головоломки/логики, и меньше вопросов программирования, но я надеялся, что кто-то сможет помочь, потому что я в тупике.Double to Int Rounding, Logic Issue

Я начинаю с целого числа и должен принимать X процентов от него. Как только я получу этот двойной номер, мне нужно округлить его до целого числа (назовите это Y). На самом деле это не имеет значения, если я его обойду, и мне все равно, как это происходит (вверх или вниз), поэтому использование пола/потолка было бы приемлемым решением - мне просто нужен int.

Позже в системе мне будет представлен int Y, и вам нужно будет знать, что такое оригинальный номер. В этот момент, если я знаю, какой процент был, и я знаю, какой метод я использовал для получения двойного значения для int - Как определить исходный номер.

Это должно работать для каждой комбинации с исходным числом/процентом.

Пример:

Original number: 997 
Percentage: 90 
Int-Conversion Method: Floor 

997 * .90 = 897.3 
floor(897.3) = 897 
Y = 897 

.. .. Учитывая 897, и зная процент и метод INT-преобразования, как можно определить оригинальный номер был 997?

+0

'897/.90 = 996.667' Не был ли исходный номер 997 не 1000? Очевидно, что это не будет на 100% точнее, так как вы округлили 'Y'. – Danny

+0

Да, 997. Извините, я редактировал оригинальный вопрос. Это проблема/вопрос, хотя есть ли способ сделать это на 100% точным? – ljump12

ответ

2
997 * .90 = 897.3 
floor(897.3) = 897 
Y = 897 

Учитывая метод, который вы предложили, я объясню, почему возвращение к точному числу не представляется возможным, учитывая способ и данные, которые вы ввели.

Вычисление процента в порядке, и вы остаетесь с значением double. Затем вы эффективно обрезаете некоторые данные, используя функцию floor. Усечение не является bijection, поэтому вы не можете вернуться с 897 -> 897.3, поэтому воспроизведение исходного номера невозможно с какой-либо степенью определенности. Вы не ошибетесь, учитывая масштаб данных, которые вы предоставили, но для больших значений или для ситуаций, требующих большей точности, вы можете найти этот метод во многом подобным предположению.

+0

Просто чтобы подтвердить, как я думаю, вы говорите, и я понимаю. Это невозможно сделать (используя любую функцию усечения/круглый/напольный/потолочный/пользовательский). – ljump12

+0

Yup. И с данными, которые у вас есть, я не вижу, как вы могли бы сделать это на 100% точным. Бит, полученный моим ответом, отвечает на ваш вопрос, отметьте его как правильно, пожалуйста :) – christopher

0

Вы бы использовать формулу

original number = calculated number/percentage 

Используя ваши номера

997 = 897/0.90 

В первоначальном расчете и обратный расчет, вам нужно округлить ответ.

Если вы этого не сделаете, вы будете отключены еще одним случаем, когда вы сделаете обратный расчет.

+0

Я пробовал это, и всегда есть краевые случаи, которые не работают. – ljump12

+0

Исправлен мой ответ. Вам нужно будет сэкономить двойное место, если вы захотите изменить процесс. –