Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.01.2013, 19:09
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

Злые числа с плавающей точкой
Доброго времени суток!
Раньше не особо обращал внимание на эту проблему, а сейчас приспичило.
в общем вот в чем проблема:

Есть целое число, от него нужно всегда отнимать 0.1 когда происходит какое либо событие.

Допустим есть число 10. Когда происходит событие в первый раз джска отнимает 0.1 и получается 9.9 Но когда событие поворяется, js отнимает уже не 0.1 а 1, тоесть было 9.9 а стало 8.9 и т.д
Подскажите пожалуйста как с этим бороться
__________________
Научу себя плохому
Ответить с цитированием
  #2 (permalink)  
Старый 07.01.2013, 19:28
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Округляй числа до целого, выполняй действия с целыми числами, и снова приводи в дробное!

http://learn.javascript.ru/number#неточные-вычисления

Последний раз редактировалось dmitry111, 07.01.2013 в 19:38.
Ответить с цитированием
  #3 (permalink)  
Старый 07.01.2013, 19:37
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

function Itog(i,N,Numb,Delta){
  var a = parseFloat((Numb - i*Delta).toFixed(N));
  return a; 
}

var Delta=0.01; // Delta - Константа уменьшения
var Numb=10.0000000001;//Изначальное неизменяемое число
var N =3 // Max-число знаков после запятой
var i=7;  // i - кол-во вычитаний из начального
alert(Itog(i,N,Numb,Delta))

Последний раз редактировалось Deff, 07.01.2013 в 20:44.
Ответить с цитированием
  #4 (permalink)  
Старый 07.01.2013, 19:38
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

dmitry111,да я всегда так и делал, дело в том, что есть два инпута к каждому инпуту по 2 кнопки.
+ и -
В 1 инпуте и считаем и отправляем все в секундах тоесть как было 25 секунд или 40 секунд, так обработчику и отправляем.
А во 2 инпуте работа отображаться должна в 10 долях секунд (например 3.2 или 3.6), а отправлятся целым числом, например если было 3.6 то обработчику отправляем 36. Вобщем точка только для человека.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
* {
margin:0;
padding:0;
}

body {
background:#393939;
color:#FFF;
}

form {
margin:50px 0 0;
}

label {
display:block;
float:left;
text-align:right;
width:140px;
padding:5px 10px 0 0;
}

input[type=text] {
float:left;
width:40px;
font:bold 20px Helvetica, sans-serif;
text-align:center;
padding:3px 0 0;
}

form div {
overflow:hidden;
margin:0 0 5px;
}

#submit {
border:1px solid #000;
background:#eee;
margin:15px 0 0 175px;
padding:5px 10px 3px;
}

#submit:hover {
background:#ccc;
}

.incdec li {
float:left;
width:30px;
height:25px;
background:#f7f7f7;
text-align:center;
padding-top:8px;
color:#000;
list-style:none;
margin-left:5px;
cursor:pointer;
border:1px solid #777;
}

.incdec li:active {
border:#000;
}
</style>

<script type="text/javascript">

function incDec(i) {
document.onmousedown = function(){return false}

if(i < 0) {
i = -i;
var valuE = parseInt(document.getElementById('valu'+i).value);

if(valuE-1 < 0) {}else{
document.getElementById('valu'+i).value = valuE - 1;
  }
 } 
else {
var valuE = parseInt(document.getElementById('valu'+i).value);
document.getElementById('valu'+i).value = valuE + 1;
 }
}

</script>

       <form id="forms" method="post" action="">
			
                
				<div>
                <label for="name">включение</label>
                <input type="text" id="valu1" value="2"/>
				<ul class="incdec">
				<li onclick="incDec(1)">+</li>
				<li onclick="incDec(-1)">-</li>
				</ul>
			    </div>
                
				
				<div>
                <label for="name">работа</label>
				<input type="text" name="turtle-doves" id="valu2" value="2"/>
				<ul class="incdec">
				<li onclick="incDec(2)">+</li>
				<li onclick="incDec(-2)">-</li>
				</ul>
				</div>
                <input type="submit" value="Ok" id="submit" />
        </form>

Зы
код писался в 4 утра, так что немного странноват)
__________________
Научу себя плохому
Ответить с цитированием
  #5 (permalink)  
Старый 07.01.2013, 19:47
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от l-liava-l
Есть целое число, от него нужно всегда отнимать 0.1 когда происходит какое либо событие.

Допустим есть число 10. Когда происходит событие в первый раз джска отнимает 0.1 и получается 9.9 Но когда событие поворяется, js отнимает уже не 0.1 а 1, тоесть было 9.9 а стало 8.9 и т.д
писать алгоритмы правильно, а не обвинять в своих ошибках язык
Ответить с цитированием
  #6 (permalink)  
Старый 07.01.2013, 19:50
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

Цитата:
писать алгоритмы правильно, а не обвинять в своих ошибках язык
А кто его обвинял? я лишь интересуюсь как справиться с невзгодами)
__________________
Научу себя плохому
Ответить с цитированием
  #7 (permalink)  
Старый 07.01.2013, 20:01
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

Deff, что то я косячу, получается тоже самое
__________________
Научу себя плохому
Ответить с цитированием
  #8 (permalink)  
Старый 07.01.2013, 20:05
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от l-liava-l
Deff, что то я косячу, получается тоже самое
Поправил
Ответить с цитированием
  #9 (permalink)  
Старый 07.01.2013, 20:45
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
* {
margin:0;
padding:0;
}

body {
background:#393939;
color:#FFF;
}

form {
margin:50px 0 0;
}

label {
display:block;
float:left;
text-align:right;
width:140px;
padding:5px 10px 0 0;
}

input[type=text] {
float:left;
width:40px;
font:bold 20px Helvetica, sans-serif;
text-align:center;
padding:3px 0 0;
}

form div {
overflow:hidden;
margin:0 0 5px;
}

#submit {
border:1px solid #000;
background:#eee;
margin:15px 0 0 175px;
padding:5px 10px 3px;
}

#submit:hover {
background:#ccc;
}

.incdec li {
float:left;
width:30px;
height:25px;
background:#f7f7f7;
text-align:center;
padding-top:8px;
color:#000;
list-style:none;
margin-left:5px;
cursor:pointer;
border:1px solid #777;
}

.incdec li:active {
border:#000;
}
</style>

<script type="text/javascript">

function incDec(i) {
document.onmousedown = function(){return false}

if(i < 0) {
i = -i;
var valuE = parseInt(document.getElementById('valu'+i).value);

if('valu'+i == 'valu2') {
/////////////////////////
function Itog(y,N,Numb,Delta){
  var a = parseFloat((Numb - y*Delta).toFixed(N));
  return a; 
}

var Numb=valuE+0.0000000001;
var Delta=0.01;
var y=0; 
var N =3;
alert(Numb +'- это numb');
alert(Itog(1,N,Numb,Delta) + '- это результат');
document.getElementById('valu'+i).value = Itog(1,N,Numb,Delta);

///////////////////////////////////////////////////
}
if(valuE-1 < 0) {}else{
//document.getElementById('valu'+i).value = valuE - 1;
  }
 } 
else {
var valuE = parseInt(document.getElementById('valu'+i).value);
document.getElementById('valu'+i).value = valuE + 1;
 }
}

</script>

       <form id="forms" method="post" action="">
			
                
				<div>
                <label for="name">включение</label>
                <input type="text" id="valu1" value="2"/>
				<ul class="incdec">
				<li onclick="incDec(1)">+</li>
				<li onclick="incDec(-1)">-</li>
				</ul>
			    </div>
                
				
				<div>
                <label for="name">работа</label>
				<input type="text" name="turtle-doves" id="valu2" value="2"/>
				<ul class="incdec">
				<li onclick="incDec(2)">+</li>
				<li onclick="incDec(-2)">-</li>
				</ul>
				</div>
                <input type="submit" value="Ok" id="submit" />
        </form>

Один в один старая проблема, вроде все так. Заметил что value из инпута забирается неправильно, например если было 1.99 то забирается 1.000...01
клацнуть по нижнему -
__________________
Научу себя плохому

Последний раз редактировалось l-liava-l, 07.01.2013 в 20:47.
Ответить с цитированием
  #10 (permalink)  
Старый 07.01.2013, 20:47
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от l-liava-l
Один в один старая проблема, вроде все так. Заметил что value из инпута забирается неправильно, например если было 1.99 то забирается 1.000...01
Забивай как строку - затем parseFloat
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить регулярное выражение для числа с плавающей точкой boomrest Общие вопросы Javascript 4 25.02.2015 11:17
Инкремент числа с плавающей точкой antonM Общие вопросы Javascript 9 16.10.2012 14:16
Точность вычисления чисел с плавающей запятой Mihas2 Общие вопросы Javascript 2 19.01.2010 16:32
число 76.4705882.. сделать 76.47? (числа всегда разные) TongaG Ваши сайты и скрипты 3 19.01.2010 07:35
10-ти байтные числа с плавающей точкой serzh44 Общие вопросы Javascript 10 21.04.2008 13:03