2010-07-15 7 views
1

я нашел следующий код в одном из рамок, которые мы используем,Каков смысл этого кода

if (nValue + 0.01 > nLimit) 
    nValue = nValue - 0.01; 

if (((nValue+1)/(int)(nValue+1)) == 1) 
     sprintf(szValue, "%0.0f", nValue); 
    else 
     sprintf(szValue, "%0.2f", nValue); 

чем смысл этого кода

+0

Это должно быть специфично для вашей инфраструктуры и требований. – ckv

+0

Что представляет собой 'nValue'? – detly

+6

Ненавижу, когда люди используют поплавки, чтобы представлять деньги ... Я бы не хотел быть тем парнем, которому предъявлено иск, потому что он все еще имеет 0,01 лет после одного платежа из-за неясных ошибок округления ... –

ответ

3

Я подозреваю, что первая часть ошибочной попытки обеспечить nValue не превышает nLimit. Это, возможно, должно быть

if (nValue + 0.01 > nLimit) 
    nValue = nLimit - 0.01; 

Другими словами, если nValue ближе, чем 0,01 до предела сделать 0,01 меньше, чем предел


Чтобы объяснить, как работает вторая часть, она включает в себя делящие число с плавающей запятой на целую часть числа. Если число является целым числом, тогда результат будет равен 1

например.

23.00/23 = 1 - It's an integer 
23.05/23 = 1.002 - It's not an integer 

Добавление 1 в каждую сторону (как ufukgun заметил), чтобы предотвратить разделим на ноль, но DeVision является излишним, как вы могли бы просто сравнить поплавок с Int

if (nValue == (int)nValue) 
0

Я думаю nValue должен быть больше, чем 0.

nValue + 1 используется для случая nValue == 0


if (((nValue+1)/(int)(nValue+1)) == 1) 

означает, что nValue является целым числом. (например, 45.00)

поэтому разработчик хотел напечатать разные для целых чисел и поплавка.

+0

Я думаю, что ваша первая часть ошибочна, но второе место на –

1

Первая часть проверяет, является ли nValue < = (nLimit - 0,01), а затем уменьшает ее на 0,01, если это не так.

Вторая часть испытания, чтобы увидеть, соответствует ли значение с плавающей точкой в ​​целое число, а затем выводит его как целое число, если так (например 42), в противном случае выводит его с двумя знаками после запятой (например, 42.01).

4
  • Предполагая, что код имеет дело с деньгами суммы, хранящиеся в плотах, первый IF вычитает 1 цент от nValue если это значение превышает определенный предел. Я ничего не могу сказать об этой цели без дополнительного контекста.

  • Второй кусок сделок (неловко) с отображением значения без десятичных знаков, если это прямая сумма «Доллар» и другие значения с двумя знаками после запятой.

+3

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

0
/* min limit of nValue is nLimit */ 
if (nValue + 0.01 > nLimit) nValue = nValue - 0.01; 

/* if nValue is a round number(no floating point value) or zero eg. 4.00 */ 
if (((nValue+1)/(int)(nValue+1)) == 1) 

sprintf(szValue, "%0.0f", nValue); 

/* nValue has floating point value eg. 5.002 */ 
else 
sprintf(szValue, "%0.2f", nValue); 

Надеется, что это может помочь вам

+2

Обратите внимание, что предельный код неверен, если это действительно то, что он пытается сделать. Попробуйте 'nValue = 100.0' и' nLimit = 1.0'. – detly

+0

@ delty, вы правы, я внес изменения. nLimit должен быть lowerLimit или threashold, а не max – Sadat

1
if (nValue + 0.01 > nLimit) 
    nValue = nValue - 0.01; 

Без в некотором контексте трудно понять цель этого кода. Кажется, он пытается убедиться, что nValue не менее 0.01 меньше nLimit, но nValue - 0.01 все еще может быть больше nLimit, и код не пытается обнаружить этот случай. Максимальное значение типа nLimit? Если нет, то что это?

if (((nValue+1)/(int)(nValue+1)) == 1) 
     sprintf(szValue, "%0.0f", nValue); 
    else 
     sprintf(szValue, "%0.2f", nValue); 

Это пытается работать, если nValue целое число. Если это целое число, храните только целую часть числа в виде строки. В противном случае сохраните значение с двумя знаками после запятой.

+0

ues nLimit - максимальное значение этого типа, оно меньше 100 – Poorna

Смежные вопросы