1. ##### Jeff
86 posts
Member since:
Feb 2008

Posted 07 Jan 2010 Link to this post

I have a form with a RadNumeric Textbox on it and here are the following results…

34.5 = 35 (rounding away from zero)

34.6 = 35 (rounding away from zero)

**** -34.5 = -34 (rounding closer to zero) ****

-34.6 = -35 (rounding away from zero)

The question I have, is why does .5 round closer to zero when it is a negative number?  Is there a way to achieve the expected results…

34.5 = 35 (rounding away from zero)

34.6 = 35 (rounding away from zero)

****  -34.5 = -35 (rounding away from zero) ****

-34.6 = -35 (rounding away from zero)

Thanks,
Steve

2. ##### Dimo
8485 posts

Posted 08 Jan 2010 Link to this post

Hello Tim,

The described behavior will be observed if you set AllowRounding="false" and DecimalDigits="0". Please set AllowRounding="true" (or remove the property) and -34.5 will be transformed to -35 upon blur.

Regards,
Dimo
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
3. ##### Jeff
86 posts
Member since:
Feb 2008

Posted 08 Jan 2010 Link to this post

The AllowRounding is set to “true” and the DecimalDigits is “0” and -34.5 is rounding to -34 not -35.

The results that I am getting above in the first post are happening with the following values…

AllowRounding = true

CultureNativeDecimalSeparator = “.”

DecimalDigits = 0

DecimalSeparator = “.”

GroupSeparator = “,”

GroupSizes = 3

KeepNotRoundedValue = true

NegativePattern = “-n”

PositivePattern = “n”

Are there any other ideas on what to do or should I create a ticket?

Thanks,

Steve

4. ##### Dimo
8485 posts

Posted 08 Jan 2010 Link to this post

Hello,

I am not able to reproduce the problem with the specified list of properties and values. The RadNumericTextBox rounds -34.5 to -35.

Kind regards,
Dimo
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
5. ##### Jeff
86 posts
Member since:
Feb 2008

Posted 08 Jan 2010 Link to this post

Created a ticket that has the demo attached.  Attached a screen shot to this forum showing the results from the demo project you requested.
Ticket #271898
Thanks,
Steve Fidler

6. ##### Dimo
8485 posts

Posted 11 Jan 2010 Link to this post

Hello Tim,

Thank you for the runnable demo. I tested with a couple of versions and actually we have fixed the issue for Q2 2009 SP1 (2009.2.826). Please upgrade.

An alternative option is to include or register the following Javascript in the <body> of the web page, so that it overrides the method from the embedded resource script file. You can remove it after upgrading in the future.

`if` `(``typeof``(Telerik) != ``"undefined"` `&& ``typeof``(Telerik.Web.UI.NumberFormat) != ``"undefined"``)`
`{`
`    ``Telerik.Web.UI.NumberFormat.Round = ``function``(number, config)`
`    ``{`
`        ``if` `(!config.get_numberFormat().AllowRounding)`
`        ``{`
`            ``var` `decDig = config.get_numberFormat().DecimalDigits;`
`            ``if` `(decDig == 0 && number.toString().indexOf(``'.'``) != -1)`
`            ``{`
`                ``return` `number.toString().substr(0, number.toString().indexOf(``'.'``) + 1);`
`            ``}`
`            ``else` `if` `(decDig > 0 && number.toString().indexOf(``'.'``) != -1)`
`            ``{`
`                ``var` `parts = number.toString().split(``'.'``);`
`                ``if` `(parts[1].length > decDig)`
`                ``{`
`                    ``return` `parseFloat(parts[0] + ``'.'` `+ parts[1].substr(0, decDig));`
`                ``}`
`                ``else`
`                ``{`
`                    ``return` `number;`
`                ``}`
`            ``}`
`            ``else`
`            ``{`
`                ``return` `number;`
`            ``}`
`        ``}`

`        ``//Very large and very small numbers are converted to scientific notation`
`        ``//in textual representation, therefore we degrade to the less precise`
`        ``//method of rounding`
`        ``if` `(number.toString().indexOf(``'e'``) > -1)`
`        ``{`
`            ``var` `pow = Math.pow(10, config.get_numberFormat().DecimalDigits);`
`            ``return` `Math.round(number * pow) / pow;`
`        ``}`
`        ``else` `if` `(number.toString().indexOf(``'.'``) > -1)`
`        ``{`

`            ``var` `parts = number.toString().split(``'.'``);`
`            ``var` `integralPart = Math.abs(parseInt(parts[0]));    ``//extract the integral part`
`            ``var` `decimalPart = parseFloat(``"0."` `+ parts[1]);      ``//extract the decimal part `
`            ``var` `decimalPartLength = parts[1].length;`
`            ``var` `sign = parts[0].charAt(0) == ``'-'` `? -1 : 1;      ``//save the sign`

`            ``//Return the number itself, if its decimal digits count is equal to`
`            ``//the DecimalDigits setting in the NumberFormat`
`            ``if` `(parts[1].length == config.get_numberFormat().DecimalDigits)`
`            ``{`
`                ``return` `number;`
`            ``}`

`            ``//raise the decimal part to power of 10 needed to make it integer`
`            ``var` `temp = decimalPart * Math.pow(10, decimalPartLength);`

`            ``//delete by 10 and round until we leave with the specified`
`            ``//number of decimal digits`
`            ``for` `(``var` `i = 1; i <= decimalPartLength; i++)`
`            ``{`
`                ``if` `(i <= decimalPartLength - config.get_numberFormat().DecimalDigits)`
`                ``{`
`                    ``temp = Math.round(temp / 10);`
`                ``}`
`                ``else`
`                ``{`
`                    ``temp /= 10;`
`                ``}`
`            ``}`

`            ``/*`
`            ``Handles cases when the decimal part if of the form: 0.00546 and we want to`
`            ``round to 3 decimal digits. At this point, temp would be 0.546 and we still`
`            ``need to divide twice by ten to get 0.005. The following IF statement`
`            ``handles cases when the decimal needs to be adjusted in such way`
`            ``*/`
`            ``if` `(temp.toString().indexOf(``'.'``) > -1)`
`            ``{`

`                ``var` `fracLengthAfterRounding = temp.toString().split(``'.'``)[1].length;`
`                ``if` `(fracLengthAfterRounding > config.get_numberFormat().DecimalDigits)`
`                ``{`
`                    ``var` `pow = Math.pow(10, config.get_numberFormat().DecimalDigits);`
`                    ``temp = Math.round(temp * pow) / pow;`
`                ``}`
`            ``}`
`            `
`            ``var` `preliminaryResult = sign * (integralPart + temp);`
`            ``if` `(config.get_numberFormat().DecimalDigits > 0 &&`
`                ``preliminaryResult.toString().indexOf(``"."``) != -1 &&`
`                ``preliminaryResult.toString().split(``"."``)[1].length > config.get_numberFormat().DecimalDigits)`
`            ``{`
`                ``return` `sign * (parseFloat(integralPart + ``"."` `+ temp.toString().substr(2)));`
`            ``}`
`            ``else`
`            ``{`
`                ``return` `preliminaryResult;`
`            ``}`
`        ``}`
`        ``else`
`        ``{`
`            ``return` `number;`
`        ``}`
`    ``}`
`}`

Kind regards,
Dimo
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.