<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Почему math.ceil(14.0)=14, а math.ceil(15.0)=16? форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 18 Apr 2026 14:03:23 +0300</pubDate>
		<item>
			<title>Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message74317/topic8504/">Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</a></b> <i>Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xywioMJV" href="/user/1339/" bx-tooltip-user-id="1339">Сергей</a> написал:<br />Добрый день.<br />Заметил странность в работе math.ceil().<br />Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?<br /><br />Для выставления цены с заданным количеством знаков после запятой, использую округление: 
====code====
<pre>&nbsp;&nbsp; function&nbsp;&nbsp; round_step_price (price, ty)
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;x =&nbsp;&nbsp;0 
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;(ty =&nbsp;&nbsp;=&nbsp;&nbsp;"sell" )&nbsp;&nbsp;-- Продаем -&#62;округлить в бОльшую сторону 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x =&nbsp;&nbsp; math.ceil (price/options.price_step)&nbsp;&nbsp;*&nbsp;&nbsp;options.price_step
&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp; -- Покупаем - округлим в меньшую сторону 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x =&nbsp;&nbsp; math.floor (price/options.price_step)&nbsp;&nbsp;*&nbsp;&nbsp;options.price_step
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;x *&nbsp;&nbsp;1 
 end 

&nbsp;&nbsp;</pre>
=============
 Задача, при шаге цены 0.1, для продаж округлять так: 1.400 -&gt;1.4, 1.4001 -&gt;1.5, и так же 1.50-&gt;1.5, 1.50001-&gt;1.6. Но мой код, не работает, как ожидалось.<br /><br />Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?<br />=============<br />Если правильно понят, то вот пример. 
====code====
<pre>local step=0.1;
local p=1.2; while 2&#62;p do&nbsp;&nbsp;p=p+0.01;
local price=p-(p % step); 
price1=price price2=price
if p-price&#62;0 then p1=p+0.1; price1=p1-(p1%step); p1=p-0.1; price2=p1-(p1%step);&nbsp;&nbsp;end
print(p,price1, price2)
end

</pre>
=============
результат:
====code====
<pre>1.21&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.22&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.23&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.24&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.25&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.26&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.27&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.28&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.29&nbsp;&nbsp;&nbsp;1.3&nbsp;&nbsp;&nbsp;1.1
1.3&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.1
1.31&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.32&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.33&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.34&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.35&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.36&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.37&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.38&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.39&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.2
1.4&nbsp;&nbsp;&nbsp;1.4&nbsp;&nbsp;&nbsp;1.4
1.41&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.42&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.43&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.44&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.45&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.46&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.47&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.48&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.49&nbsp;&nbsp;&nbsp;1.5&nbsp;&nbsp;&nbsp;1.3
1.5&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.51&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.52&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.53&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.54&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.55&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.56&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.57&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.58&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.59&nbsp;&nbsp;&nbsp;1.6&nbsp;&nbsp;&nbsp;1.4
1.6&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.61&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.62&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.63&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.64&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.65&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.66&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.67&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.68&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.69&nbsp;&nbsp;&nbsp;1.7&nbsp;&nbsp;&nbsp;1.5
1.7&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.71&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.72&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.73&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.74&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.75&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.76&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.77&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.78&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.79&nbsp;&nbsp;&nbsp;1.8&nbsp;&nbsp;&nbsp;1.6
1.8&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.81&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.82&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.83&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.84&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.85&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.86&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.87&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.88&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.89&nbsp;&nbsp;&nbsp;1.9&nbsp;&nbsp;&nbsp;1.7
1.9&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.91&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.92&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.93&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.94&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.95&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.96&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.97&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.98&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
1.99&nbsp;&nbsp;&nbsp;2.0&nbsp;&nbsp;&nbsp;1.8
2.0&nbsp;&nbsp;&nbsp;2.1&nbsp;&nbsp;&nbsp;1.9
</pre>
============= <br />
			<i>13.02.2024 16:41:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message74317/topic8504/</link>
			<guid>http://forum.quik.ru/messages/forum10/message74317/topic8504/</guid>
			<pubDate>Tue, 13 Feb 2024 16:41:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message74309/topic8504/">Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</a></b> <i>Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ну math.ceil(15.0) конечно не равен 16. Но если это результат вычисления, и там на самом деле не 15.0, а 15.0000000000000001 тогда да, &nbsp;будет 16.<br />Проблема в том, что десятичные дроби не могут быть точно представлены, если только знаменатель не степень двойки. В частности, шаг цены 0.1:
====code====
<pre>&#62; return string.format("%1.18f",0.1)
0.100000000000000006
</pre>
=============
И да, единственный способ избежать ошибок округления - работать с целыми числами. <br />
			<i>13.02.2024 13:09:35, paluke.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message74309/topic8504/</link>
			<guid>http://forum.quik.ru/messages/forum10/message74309/topic8504/</guid>
			<pubDate>Tue, 13 Feb 2024 13:09:35 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message74297/topic8504/">Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</a></b> <i>Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В мире финансов принято работать с целыми числами. Именно по причине ошибок арифметики с плавающей точкой. Для примера <noindex><a href="https://ec.europa.eu/economy_finance/publications/pages/publication1224_en.pdf" target="_blank" rel="nofollow">https://ec.europa.eu/economy_finance/publications/pages/publication1224_en.pdf</a></noindex><br />Чаще всего это делают приводя число к целому виду (числу пунктов), так называемый decimal type.<br /><br />Для примера, цена 145.53 при шаге 0.1, должна быть приведена либо к 145.50 или к 145.60.<br />Значит в пунктах наша цена = 14553, шаг 10. <br /><br />Тогда можно взять остаток от деления 14553%10 = 3. И если он меньше некого порога, например 5, то вычитаем его 14553 - 3 = 14550.<br />А если больше, для примера 14558%10 = 8, то прибавляем 14553 - 8 + 10 = 14560<br /><br />Точная цена - это полученное число, обратно приведенное к разрядности. В данном примере это / 100.<br /><br />Но это просто один из вариантов. <br />
			<i>12.02.2024 15:38:17, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message74297/topic8504/</link>
			<guid>http://forum.quik.ru/messages/forum10/message74297/topic8504/</guid>
			<pubDate>Mon, 12 Feb 2024 15:38:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message74289/topic8504/">Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?</a></b> <i>Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день.<br />Заметил странность в работе math.ceil().<br />Почему math.ceil(14.0)=14, а math.ceil(15.0)=16?<br /><br />Для выставления цены с заданным количеством знаков после запятой, использую округление:
====code====
<pre>function round_step_price(price, ty)
&nbsp;&nbsp;&nbsp;&nbsp;local x=0
&nbsp;&nbsp;&nbsp;&nbsp;if (ty=="sell") -- Продаем -&#62;округлить в бОльшую сторону
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x= math.ceil(price/options.price_step) * options.price_step
&nbsp;&nbsp;&nbsp;&nbsp;else -- Покупаем - округлим в меньшую сторону
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x= math.floor(price/options.price_step) * options.price_step
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return x*1
end

</pre>
=============
Задача, при шаге цены 0.1, для продаж округлять так: 1.400 -&gt;1.4, 1.4001 -&gt;1.5, и так же 1.50-&gt;1.5, 1.50001-&gt;1.6. Но мой код, не работает, как ожидалось.<br /><br />Как вы округляете в большую/меньшую сторону, с заданным количеством десятичных знаков? <br />
			<i>12.02.2024 14:28:37, Сергей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message74289/topic8504/</link>
			<guid>http://forum.quik.ru/messages/forum10/message74289/topic8504/</guid>
			<pubDate>Mon, 12 Feb 2024 14:28:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
