<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Say what? Microsoft Malaysia One ISV Technology Blog : MidpointRounding)</title><link>http://blogs.msdn.com/fai/archive/tags/MidpointRounding_2900_/default.aspx</link><description>Tags: MidpointRounding)</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>A better alternative to solving the rounding mechanism in your apps</title><link>http://blogs.msdn.com/fai/archive/2008/06/11/a-better-alternative-to-solving-the-rounding-mechanism-in-your-apps.aspx</link><pubDate>Wed, 11 Jun 2008 06:45:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8590776</guid><dc:creator>hoongfai</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/fai/comments/8590776.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fai/commentrss.aspx?PostID=8590776</wfw:commentRss><description>&lt;p&gt;Awhile back, I wrote a &lt;a href="http://blogs.msdn.com/fai/archive/2008/04/10/rounding-mechanism-exercise-how-to-mitigate-the-impact-on-isv-solutions.aspx"&gt;blog post on the rounding mechanism&lt;/a&gt;, little did I know that a reader posted a better alternative in the comments (I should read keep track of the comments closely in the future). I haven't tested this, but I trust the contributor of this piece of code. Full credit goes to &lt;a href="http://blogs.msdn.com/user/Profile.aspx?UserID=135005"&gt;gohsianghwee&lt;/a&gt; for posting this, and I quote him:&lt;/p&gt; &lt;p&gt;There is a better alternative, pass in the value 1234.23 and round digit as 2 will solve your problem. This algorithm makes user definable rounding possible. In fact, I just showed you one of my rounding mechanism in my application, which all rounding mechanism in my application are user definable.&lt;/p&gt; &lt;p&gt;User must always use decimal in terms of dollar and cent calculation. Even though decimal is not a primitive type, but it handles the calculation more appropriately compared to the others. This is due to how .NET handles primitive type figures.  &lt;p&gt;public static decimal RoundAmount(decimal roundValue, decimal roundDigit) &lt;p&gt;{ &lt;p&gt;decimal totalValue = 0; &lt;p&gt;decimal powerValue = 0; &lt;p&gt;powerValue = (decimal)(System.Math.Pow(10, (double)roundDigit)); &lt;p&gt;decimal tempDecimalValue = 5 / powerValue; &lt;p&gt;decimal rndFigure = roundValue / tempDecimalValue; &lt;p&gt;totalValue =(decimal)(System.Math.Round(rndFigure, 0)) * tempDecimalValue; &lt;p&gt;return totalValue; &lt;p&gt;} &lt;p&gt;Thanks!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8590776" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fai/archive/tags/ISV/default.aspx">ISV</category><category domain="http://blogs.msdn.com/fai/archive/tags/BNM_2700_s+rounding+mechanism+exercise/default.aspx">BNM's rounding mechanism exercise</category><category domain="http://blogs.msdn.com/fai/archive/tags/rounding+mechanism/default.aspx">rounding mechanism</category><category domain="http://blogs.msdn.com/fai/archive/tags/Decimal.Round_2800_Decimal/default.aspx">Decimal.Round(Decimal</category><category domain="http://blogs.msdn.com/fai/archive/tags/MidpointRounding_2900_/default.aspx">MidpointRounding)</category></item><item><title>Rounding mechanism exercise, how to mitigate the impact on ISV solutions?</title><link>http://blogs.msdn.com/fai/archive/2008/04/10/rounding-mechanism-exercise-how-to-mitigate-the-impact-on-isv-solutions.aspx</link><pubDate>Thu, 10 Apr 2008 09:22:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8374165</guid><dc:creator>hoongfai</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/fai/comments/8374165.aspx</comments><wfw:commentRss>http://blogs.msdn.com/fai/commentrss.aspx?PostID=8374165</wfw:commentRss><description>&lt;p&gt;In my previous blog post, I mentioned about &lt;a href="http://www.bnm.gov.my/index.php?ch=209&amp;amp;pg=657&amp;amp;ac=567" target="_blank"&gt;BNM's rounding mechanism exercise&lt;/a&gt; in Malaysia. There are certain implications on any Malaysian ISV solutions which process over-the-counter (OTC) payment transactions, settled in cash or non-cash. These type of transactions will be subjected to the Rounding Mechanism. However all online payments, such as payments via Internet, are NOT subjected to the Rounding Mechanism, e.g., paying utility bills via Internet. The rounding mechanism only applied to &lt;strong&gt;the total amount of a bill and not on individual items&lt;/strong&gt;.  &lt;p&gt;The rounding exercise only applies to business applications that process OTC transactions, such as POS terminal. However I reckon that this may also affect your line-of-business (LOB) applications, and I could see that the Microsoft Dynamics line of products like CRM, Navision, AX already allows rounding to be configured within itself.  &lt;p&gt;For your custom-developed solution, you would have to make changes in your application/code to accommodate to rounding of currency. Essentially only the total amount needs to be rounded up or down. If you are making code changes, only class members such as a &lt;em&gt;TotalAmount&lt;/em&gt; property needs to be rounded off. If you don't have too many of such properties lying around, this is only involves minimal effort. However if you have such properties appearing all over your code, it may be wise to create your own custom class that represents the &lt;em&gt;TotalAmount&lt;/em&gt;. You should use &lt;a href="http://msdn2.microsoft.com/en-us/library/system.decimal(VS.80).aspx" target="_blank"&gt;System.Decimal&lt;/a&gt; structure to represent the amount. The following code example performs the rounding mechanism but &lt;strong&gt;&lt;u&gt;only for positive values&lt;/u&gt;&lt;/strong&gt;. As a recap, this is how the rounding mechanism works in Malaysia: &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/fai/WindowsLiveWriter/Roundingmechanismexercisehowtomitigateth_F20E/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="259" alt="image" src="http://blogs.msdn.com/blogfiles/fai/WindowsLiveWriter/Roundingmechanismexercisehowtomitigateth_F20E/image_thumb.png" width="371" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&lt;font color="#0080ff"&gt;namespace RoundingMechanism&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Keeping my total amount in Decimals to allow the rounding mechanism.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This class only rounds positive values. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class RoundedAmount&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const decimal lowDown = 0.02M;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const decimal highDown = 0.07M;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const decimal fiveCents = 0.05M;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const decimal lowUp = 0.04M;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const string dataFmt = "{0,43}&amp;nbsp;&amp;nbsp;&amp;nbsp; {1}&amp;nbsp; =&amp;nbsp; {2}"; &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected decimal Amount; &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public decimal Value&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Amount;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decimal cents = value % Decimal.Round(value, 1, MidpointRounding.ToEven);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cents &amp;gt; 0.09M)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decimal newcents = Decimal.Round(value, 1, MidpointRounding.ToEven) - value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (newcents == 0.05M)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amount = value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (newcents &amp;lt;= 0.02M)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amount = Decimal.Round(value, 1, MidpointRounding.ToEven);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amount = Decimal.Round(value, 1, MidpointRounding.ToEven) - 0.05M; &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cents &amp;lt;= lowDown)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amount = Decimal.Round(value, 1, MidpointRounding.ToEven);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Amount = Decimal.Round(value, 1, MidpointRounding.ToEven) + 0.05M;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string ToString()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "RM" + Amount.ToString("C");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RoundedAmount amount = new RoundedAmount(); &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "This example demonstrates the rounding mechanism exercise.\n"); &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.31 )", amount.Value = 123.31M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.32 )", amount.Value = 123.32M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.33 )", amount.Value = 123.33M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.34 )", amount.Value = 123.34M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.35 )", amount.Value = 123.35M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.36 )", amount.Value = 123.36M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.37 )", amount.Value = 123.37M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.38 )", amount.Value = 123.38M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.39 )", amount.Value = 123.39M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(dataFmt,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Amount: Rounding ( 123.70 )", amount.Value = 123.70M, amount.ToString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine(); &lt;/font&gt; &lt;p&gt;&lt;font color="#0080ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/font&gt; &lt;p&gt;While working on this sample application, I discovered a weird behavior of &lt;a href="http://msdn2.microsoft.com/en-us/library/9s0xa85y.aspx" target="_blank"&gt;Decimal.Round(Decimal, Int32, MidpointRounding)&lt;/a&gt;. System.MidpointRounding.ToEven is supposed to round 3.45 to 3.4, as shown in this &lt;a href="http://msdn2.microsoft.com/en-us/library/system.midpointrounding.aspx" target="_blank"&gt;code example&lt;/a&gt;. However, when I ran my application, rounding 3.45 returns a result of 3.5. If anyone knows why it is behaving as such, please leave a comment on this blog post. I did a quick hack and ended up with another block of if-else statement to handle decimals that are from 0.05 to 0.09. &lt;p&gt;Another option is to do this at SQL Server level, I saw this mentioned in this article: &lt;a href="http://support.microsoft.com/kb/196652"&gt;http://support.microsoft.com/kb/196652&lt;/a&gt;  &lt;p&gt;Another website suggested using your own custom/private APIs for doing rounding of currency, not just specifically for Malaysia's case, but for any countries that have introduced rounding mechanism. &lt;a href="http://www.xencraft.com/resources/multi-currency.html"&gt;http://www.xencraft.com/resources/multi-currency.html&lt;/a&gt;. But this would incur additional API method invocations.&lt;/p&gt; &lt;p&gt;On a side note, I could recall a case of bank fraud during my days as a student in Melbourne, Australia (not committed by me of course). The fraud was a result of an illegal opportunity to capitalize on the rounding exercise in Australia. The "opportunist" worked as a developer in a bank in Australia. He inserted an "easter egg" (except that it is not for fun, but for illegal gains) into the application whereby the amount which were rounded off (the amount would just be in terms of a couple of cents), would be collected and deposited into his own bank account. The fraud went undetected for years. The fraud was discovered when he gambled away and lost hundreds of thousands of dollars at Crown Casino in Melbourne, and that pretty much raised the alarm. I sure hope that Malaysian developers are a lot more ethical than that.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8374165" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/fai/archive/tags/rounding+mechanism/default.aspx">rounding mechanism</category><category domain="http://blogs.msdn.com/fai/archive/tags/Decimal.Round_2800_Decimal/default.aspx">Decimal.Round(Decimal</category><category domain="http://blogs.msdn.com/fai/archive/tags/MidpointRounding_2900_/default.aspx">MidpointRounding)</category><category domain="http://blogs.msdn.com/fai/archive/tags/System.Decimal/default.aspx">System.Decimal</category><category domain="http://blogs.msdn.com/fai/archive/tags/Int32/default.aspx">Int32</category></item></channel></rss>